Ceriwis  

Go Back   Ceriwis > HOBI > Komputer & Teknologi > Programming

Programming Share, tanya jawab, saling bantu antar programmer dengan berbagai macam bahasa pemrograman.

Reply
 
Thread Tools
  #1  
Old 21st November 2011
PHPmaster PHPmaster is offline
Ceriwiser
 
Join Date: Nov 2011
Posts: 332
Rep Power: 14
PHPmaster mempunyai hidup yang Normal
Default [SQL] Yang punya problem SQL kumpul disini gan... (no urgent please)

Yang mau belajr SQL sama2 sharing di sini ya...

Berikut ini contoh soalnya...




Spoiler for ambil hanya angka di ujung kanan saja:







Spoiler for contoh data:







Quote:





PERISMM 3D 16/05/08 7.65

BBTN 3D 16/05/08 7.65

PERISMM 3D 9/10/08 10.25

PERISMM 3D 01/02/10 6.25

PERISMM 3D 01/02/10 6.25

HSBC 3D 01/02/10 6.25

NIAGA 3D 01/05/09 8.25

PERISMM 3D 01/08/08 8.55

PERISMM 3D 01/10/09 6

BCA 3D 02/02/09 10.15

PERISMM 3D 02/03/09 9.50

PERISMM 3D 02/05/08 6.7





data seperti di atas, yang mau diambil hanya angka di ujung kanan saja








Spoiler for solusinya:






angka yang mau kita ambil posisinya selalu paling kanan, jadi kita bisa pakai fungsi right buat mengambilnya. kemudian angka di ujung dengan teks lainnya dipisahkan dengan spasi. Asalkan kita bisa hitung jumlah karakter dari ujung kanan sampai spasi pemisah tadi. nah... jika jumlah karakternya sudah kita dapat maka kita bisa pakai fungsi right untuk mengambil angka di kanan tersebut.



pemecahannya sebenarnya mudah asal kita tahu yang kita inginkan. solusinya adalah seperti berikut ini,

hanya bisa jalan di sql server 2005 ke atas karena pake CTE




Code:

with t as (
select 'PERISMM 3D 16/05/08 7.65' as data union all
select 'BBTN 3D 16/05/08 7.65' as data union all
select 'PERISMM 3D 9/10/08 10.25' as data union all
select 'PERISMM 3D 01/02/10 6.25' as data union all
select 'PERISMM 3D 01/02/10 6.25' as data union all
select 'HSBC 3D 01/02/10 6.25' as data union all
select 'NIAGA 3D 01/05/09 8.25' as data union all
select 'PERISMM 3D 01/08/08 8.55' as data union all
select 'PERISMM 3D 01/10/09 6' as data union all
select 'BCA 3D 02/02/09 10.15' as data union all
select 'PERISMM 3D 02/03/09 9.50' as data union all
select 'PERISMM 3D 02/05/08 6.7' as data
)
select right(data,charindex(' ',reverse(data))-1) as hasil
from t









Spoiler for outputnya:





Code:

hasil
------------------------
7.65
7.65
10.25
6.25
6.25
6.25
8.25
8.55
6
10.15
9.50
6.7

(12 row(s) affected)














Spoiler for perhitungan pakai view:







Spoiler for pertanyaan:







Quote:






Originally Posted by ScreamX



kalo misal'a ada perhitungan'a

misal field nilai_a dan nilai_b

dengan perhitungan (nilai_a+nilai_b) terus hasil ini di masukin ke field nilai_akhir dengan table yang berbeda..




Code:

Table Mahasiswa
create table Mahasiswa(
NPM NUMBER(8)NOT NULL PRIMARY KEY,
NAMA VARCHAR2(25),
TGL_LAHIR DATE,
ALAMAT VARCHAR2(25),
KOTA VARCHAR2(15),
TELP CHAR(13)
);

Table MK
create table Mata_Kuliah (
KD_MK CHAR(4) NOT NULL PRIMARY KEY,
NAMA_MK VARCHAR2(15),
SKS NUMBER(1)
);

Table Nilai
CREATE TABLE NILAI (
NPM number(8) NOT NULL,
KD_MK CHAR (4) NOT NULL,
NILAI_UTS NUMBER(5),
NILAI_UAS NUMBER(5),
CONSTRAINT PK_NILAI PRIMARY KEY(NPM, KD_MK),
CONSTRAINT FK_NILAI_MAHASISWA FOREIGN KEY (NPM)
REFERENCES MAHASISWA (NPM),
CONSTRAINT FK_NILAI_MATA_KULIAH FOREIGN KEY(KD_MK)
REFERENCES MATA_KULIAH(KD_MK)
);

Table Nilai Hasil :
Create table Hasil (
Npm number(8),
Nama varchar(25),
Nama_MK varchar(25),
Sks number(1),
Nilai_Hasil number(5)
);

gan, tabel hasil tuh ngambil data dari tiap-tiap tabel, field nilai_hasil ngambil data dari hasil perhitungan field nilai_uts dan nilai_uas dari table Nilai

gimana'a gan..?














Spoiler for jawaban:






Kalau maunya data nampil dengan field2 sepertidi tabel hasil, bisa pakai query saja




Code:

SELECT m.npm, m.nama, mk.nama_mk, mk.sks, (n.nilai_uts+n.nilai_uas)/2 as nilai_hasil
FROM mahasiswa m
JOIN mata_kuliah mk on m.npm = mk.npm
JOIN nilai n on mk.kd_mk = n.kd_mk

ini query standar bisa jalan di database (rdbms) mana aja
















Spoiler for TRIGGER in ACTION:





Quote:






Originally Posted by aditz.joe



bahas ttg TRIGGER woii...minta link" belajar nya gitu.....






Contoh penggunaan trigger untuk mencatat stock barang

berdasarkan transaksi keluar masuk barang.





Code:

mysql> create table barang (
-> id int auto_increment,
-> nama varchar(100) null,
-> stock int not null default 0,
-> primary key (id)
-> );
Query OK, 0 rows affected (0.05 sec)

mysql> create table transaksi (
-> id int auto_increment,
-> tanggal date null,
-> barang_id int null,
-> quantity int not null default 0,
-> primary key (id),
-> foreign key (barang_id) references barang (id)
-> );
Query OK, 0 rows affected (0.06 sec)

Masukkan data barang satu per satu kemudian tampilkan isi tabel.

Dapar terlihat di bawah, stock barang tersebut masih 0 (nol besar)





Code:

mysql> insert into barang (nama) values ('laptop');
Query OK, 1 row affected (0.00 sec)

mysql> insert into barang (nama) values ('kamera');
Query OK, 1 row affected (0.00 sec)

mysql> select * from barang;
+----+--------+-------+
| id | nama | stock |
+----+--------+-------+
| 1 | laptop | 0 |
| 2 | kamera | 0 |
+----+--------+-------+
2 rows in set (0.00 sec)

Sekarang buat trigger di tabel transaksi untuk mengupdate stock pada tabel barang sesuai dengan quantity yang dimasukkan ke dalam tabel transaksi.




Code:

mysql> delimiter $$
mysql> create trigger trg_transaksi_insert
-> after insert on transaksi
-> for each row begin
-> update barang
-> set barang.stock = barang.stock + new.quantity
-> where barang.id = new.barang_id;
-> end$$
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter ;



Sekarang buat transaksi barang masuk





Code:

mysql> insert into transaksi (tanggal, barang_id, quantity)
-> values ('2011-05-30', 1, 20);
Query OK, 1 row affected (0.04 sec)

mysql> insert into transaksi (tanggal, barang_id, quantity)
-> values ('2011-05-30', 2, 50);
Query OK, 1 row affected (0.01 sec)



Tampilkan isi tabel barang dan....

Jreng... jreng... jreng.... data stock sudah ter-update





Code:

mysql> select * from barang;
+----+--------+-------+
| id | nama | stock |
+----+--------+-------+
| 1 | laptop | 20 |
| 2 | kamera | 50 |
+----+--------+-------+
2 rows in set (0.00 sec)

Sekarang coba buat transaksi barang keluar (quantity-nya kita buat minus)

Dan lihatlah.... secara ajaib stock barang langsung berkurang





Code:

mysql> insert into transaksi (tanggal, barang_id, quantity)
-> values ('2011-05-30', 2, -15);
Query OK, 1 row affected (0.01 sec)

mysql> select * from barang;
+----+--------+-------+
| id | nama | stock |
+----+--------+-------+
| 1 | laptop | 20 |
| 2 | kamera | 35 |
+----+--------+-------+
2 rows in set (0.00 sec)

Ini isi tabel transaksinya




Code:

mysql> select * from transaksi;
+----+------------+-----------+----------+
| id | tanggal | barang_id | quantity |
+----+------------+-----------+----------+
| 1 | 2011-05-30 | 1 | 20 |
| 2 | 2011-05-30 | 2 | 50 |
| 3 | 2011-05-30 | 2 | -15 |
+----+------------+-----------+----------+
3 rows in set (0.00 sec)



Semoga berguna







Spoiler for menghitung absensi pake group by:





Quote:






Originally Posted by pengumpul



gan ane punya kasus mhn pencerahannya.



ane pgn mengetahui jumlah absen masuk dari (bln 2 tgl 31) sampai (bln 3 tgl 1). mohon pencerahannya gan???







Silakan lihat query dasarnya seperti dibawah ini,




Code:

mysql> select * from pegawai;
+----+-------+
| id | nama |
+----+-------+
| 1 | ane |
| 2 | udin |
| 3 | jamal |
| 4 | budi |
+----+-------+
4 rows in set (0.09 sec)

mysql> select * from absen;
+------+---------+---------+---------+
| id | tgl_msk | bln_msk | thn_msk |
+------+---------+---------+---------+
| 1 | 30 | 2 | 2011 |
| 2 | 30 | 2 | 2011 |
| 3 | 30 | 2 | 2011 |
| 1 | 31 | 2 | 2011 |
| 2 | 31 | 2 | 2011 |
| 3 | 31 | 2 | 2011 |
| 4 | 31 | 2 | 2011 |
| 1 | 1 | 3 | 2011 |
| 3 | 1 | 3 | 2011 |
| 2 | 1 | 3 | 2011 |
+------+---------+---------+---------+
10 rows in set (0.00 sec)

mysql> select nama, count(*) as "jumlah masuk"
-> from pegawai a join absen b on a.id=b.id;
+------+--------------+
| nama | jumlah masuk |
+------+--------------+
| ane | 10 |
+------+--------------+
1 row in set (0.03 sec)

mysql> select nama, count(*) as "jumlah masuk"
-> from pegawai a join absen b on a.id=b.id
-> group by nama;
+-------+--------------+
| nama | jumlah masuk |
+-------+--------------+
| ane | 3 |
| budi | 1 |
| jamal | 3 |
| udin | 3 |
+-------+--------------+
4 rows in set (0.00 sec)

Contoh di atas menggunakan database mysql, jelas terlihat bahwa ketika kita lupa memberikan clause group by, maka query tetapjalan namun tidak memberikan hasil yang kita ingnkan. Hasil yang benar baru muncul ketika kita berikan cluase group by.



untuk menampilkan nama tertentu silakan masuk filter nama='...' ke where clause saja.














Spoiler for Trit ane yang lain:






Programmer berdasarkan LEVEL-nya

Belajar SQL bareng

Aplikasi Database Sederhana (C#)

Penampakan TV Raksasa di Indonesia

Jika Istilah Komputer Diterjemahkan ke Bahasa Malaysia









</div>

Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


 


All times are GMT +7. The time now is 10:42 PM.


no new posts