Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara menggunakan kolom dengan nilai berbeda di baris yang sama di sql?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengatur nama tabel secara terprogram dalam PL/SQL?

  2. SELECT sederhana dengan variabel tetapi tanpa INTO

  3. Impor dump dengan parameter SQLFILE tidak mengembalikan data di dalam tabel

  4. Fungsi Ganti Oracle

  5. Menggunakan tanggal dalam batasan pemeriksaan, Oracle