Mengenai komentar sebelumnya tentang desain tabel - pada kenyataannya, ada redundansi dalam tabel; Anda bisa menyimpan empname di tabel lain, yang akan Anda gabungkan dengan tabel Anda di sini untuk menghindarinya; setiap redundansi adalah kontradiksi potensial. Namun, jika kita memiliki desain tabel yang dioptimalkan untuk kueri dan meminimalkan penggabungan yang diperlukan, mungkin akan diisi dalam pekerjaan batch dari tempat lain, dan kemudian desainnya akan sesuai.
Apa yang ingin Anda lakukan di sini sering disebut sebagai 'pivot horizontal'. Kami kekurangan beberapa info di sini, jadi saya mengasumsikan jumlah pinjaman maksimum 2. Kami membutuhkan mekanisme yang memungkinkan kami memasukkan data ke dalam col1 atau col2, tergantung pada apakah itu baris pertama atau kedua untuk empno yang sama. Itu sebabnya kami menghasilkan nomor urut. Terakhir, kita menggunakan ekspresi SUM(CASE seq WHEN ...) bersama dengan GROUP BY untuk mengurangi jumlah baris dan meratakan tabel.
Ini dia:
-- first global table expression - the input table
-- The table could exist already, and then this would not be needed.
WITH foo(empno,empname,loanref,amount) AS (
SELECT 1,'abc',123,100
UNION ALL SELECT 1,'abc',456,200
)
-- second global table expression - add sequence number
-- this needs to be in the query
, foo_numbered AS (
SELECT
-- need a number: 1 for the first, 2 for the second loan
ROW_NUMBER() OVER(PARTITION BY empname ORDER BY loanref) AS seq
, *
FROM foo
)
SELECT
empno
, empname
, MAX(CASE seq WHEN 1 THEN loanref END) AS loanref_1
, SUM(CASE seq WHEN 1 THEN amount END) AS amount_1
, MAX(CASE seq WHEN 2 THEN loanref END) AS loanref_2
, SUM(CASE seq WHEN 2 THEN amount END) AS amount_2
FROM foo_numbered
GROUP BY
empno
, empname
;
Selamat bermain
Marco