About this Challenge

Challenge SQL yang dibuat oleh xeratic ini merupakan challenge pertama di dalam chapter projects DQLab Course yang bertujuan untuk menguji tingkat pemahaman SQL.

Tabel data yang tersedia

ms_pelanggan       ms_produk  
Field Type     Field Type
no_urut Integer     no_urut Integer
kode_pelanggan Varchar     kode_produk Varchar
nama_pelanggan Varchar     nama_produk Varchar
alamat Varchar     harga Double
tr_penjualan         tr_penjualan_detail  
Field Type       Field Type
kode_transaksi Varchar       kode_transaksi Varchar
kode_pelanggan Varchar       kode_produk Varchar
tanggal_transaksi Date       qty Integer
          harga_satuan Double

1. tampilkan daftar produk yang memiliki harga antara 50.000 and 150.000.Nama kolom yang harus ditampilkan: no_urut, kode_produk, nama_produk, dan harga

SELECT no_urut, kode_produk, nama_produk, harga 
FROM ms_produk
WHERE harga >= 50000 and harga <= 150000;

2. Tampilkan semua produk yang mengandung kata Flashdisk. Nama kolom yang harus ditampilkan: no_urut, kode_produk, nama_produk, dan harga.

SELECT no_urut, kode_produk, nama_produk, harga 
FROM ms_produk 
WHERE nama_produk LIKE '%Flashdisk%';

3. Tampilkan hanya nama-nama pelanggan yang hanya memiliki gelar-gelar berikut: S.H, Ir. dan Drs. Nama kolom yang harus ditampilkan: no_urut, kode_pelanggan, nama_pelanggan, dan alamat.

SELECT no_urut, kode_pelanggan, nama_pelanggan, alamat 
FROM ms_pelanggan 
WHERE nama_pelanggan 
LIKE '%S.H.%' OR nama_pelanggan LIKE '%Ir.%' OR nama_pelanggan LIKE '%Drs.%';

4. Tampilkan nama-nama pelanggan dan urutkan hasilnya berdasarkan kolom nama_pelanggan dari yang terkecil ke yang terbesar (A ke Z). Nama kolom yang harus ditampilkan: nama_pelanggan.

SELECT nama_pelanggan 
FROM ms_pelanggan 
ORDER by nama_pelanggan;

5. Tampilkan nama-nama pelanggan dan urutkan hasilnya berdasarkan kolom nama_pelanggan dari yang terkecil ke yang terbesar (A ke Z), namun gelar tidak boleh menjadi bagian dari urutan. Contoh: Ir. Agus Nugraha harus berada di atas Heidi Goh. Nama kolom yang harus ditampilkan: nama_pelanggan.

SELECT nama_pelanggan 
FROM ms_pelanggan 
ORDER BY SUBSTRING_INDEX(nama_pelanggan, ". ", -1);

6. Tampilkan nama pelanggan yang memiliki nama paling panjang. Jika ada lebih dari 1 orang yang memiliki panjang nama yang sama, tampilkan semuanya.Nama kolom yang harus ditampilkan: nama_pelanggan

SELECT nama_pelanggan 
FROM ms_pelanggan 
WHERE LENGTH(nama_pelanggan) = (
    SELECT max(LENGTH(nama_pelanggan)) FROM ms_pelanggan
    );

7. Tampilkan nama orang yang memiliki nama paling panjang (pada row atas), dan nama orang paling pendek (pada row setelahnya). Gelar menjadi bagian dari nama. Jika ada lebih dari satu nama yang paling panjang atau paling pendek, harus ditampilkan semuanya. Nama kolom yang harus ditampilkan: nama_pelanggan.

SELECT nama_pelanggan 
FROM ms_pelanggan 
WHERE LENGTH(nama_pelanggan) IN (
    (SELECT MAX(LENGTH(nama_pelanggan)) FROM ms_pelanggan),
    (SELECT MIN(LENGTH(nama_pelanggan)) FROM ms_pelanggan)
) 
ORDER BY LENGTH(nama_pelanggan) DESC;

8. Tampilkan produk yang paling banyak terjual dari segi kuantitas. Jika ada lebih dari 1 produk dengan nilai yang sama, tampilkan semua produk tersebut. Nama kolom yang harus ditampilkan: kode_produk, nama_produk,total_qty.

SELECT
    ms_produk.kode_produk,
    ms_produk.nama_produk,
    SUM(tr_penjualan_detail.qty) AS total_qty
FROM
    ms_produk
    INNER JOIN tr_penjualan_detail ON ms_produk.kode_produk = tr_penjualan_detail.kode_produk
GROUP BY
    ms_produk.kode_produk,
    ms_produk.nama_produk
HAVING
    SUM(tr_penjualan_detail.qty) > 2;

9. Siapa saja pelanggan yang paling banyak menghabiskan uangnya untuk belanja? Jika ada lebih dari 1 pelanggan dengan nilai yang sama, tampilkan semua pelanggan tersebut. Nama kolom yang harus ditampilkan: kode_pelanggan, nama_pelanggan, total_harga.

SELECT
    tr_penjualan.kode_pelanggan,
    ms_pelanggan.nama_pelanggan,
    SUM(
        tr_penjualan_detail.qty * tr_penjualan_detail.harga_satuan
    ) AS total_harga
FROM
    ms_pelanggan
    INNER JOIN tr_penjualan USING (kode_pelanggan)
    INNER JOIN tr_penjualan_detail USING (kode_transaksi)
GROUP BY
    tr_penjualan.kode_pelanggan,
    ms_pelanggan.nama_pelanggan
ORDER BY
    total_harga DESC 
LIMIT 1;

10. Tampilkan daftar pelanggan yang belum pernah melakukan transaksi.Nama kolom yang harus ditampilkan: kode_pelanggan, nama_pelanggan, alamat.

SELECT kode_pelanggan, nama_pelanggan, alamat
FROM ms_pelanggan
WHERE kode_pelanggan NOT IN (SELECT kode_pelanggan FROM tr_penjualan)

11. Tampilkan transaksi-transaksi yang memiliki jumlah item produk lebih dari 1 jenis produk. Dengan lain kalimat, tampilkan transaksi-transaksi yang memiliki jumlah baris data pada table tr_penjualan_detail lebih dari satu. Nama kolom yang harus ditampilkan: kode_transaksi, kode_pelanggan, nama_pelanggan, tanggal_transaksi, jumlah_detail

SELECT tr_penjualan.kode_transaksi, tr_penjualan.kode_pelanggan, ms_pelanggan.nama_pelanggan, tr_penjualan.tanggal_transaksi, COUNT(tr_penjualan_detail.kode_produk) as jumlah_detail	
FROM tr_penjualan 
INNER JOIN tr_penjualan_detail on tr_penjualan_detail.kode_transaksi=tr_penjualan.kode_transaksi
INNER JOIN ms_pelanggan on ms_pelanggan.kode_pelanggan=tr_penjualan.kode_pelanggan
GROUP BY tr_penjualan.kode_transaksi,
    tr_penjualan.kode_pelanggan,
    ms_pelanggan.nama_pelanggan,
    tr_penjualan.tanggal_transaksi

HAVING COUNT(tr_penjualan_detail.kode_produk) > 1