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

Cara menggunakan ROLLUP, RANK() dengan tabel pivot di Oracle11g

Saya tidak berpikir rentang Anda cukup tepat untuk kueri yang Anda tulis, meskipun kata-kata dari tugas tersebut ambigu karena 'antara' inklusif - jadi saat pertanyaannya disusun, skor kredit persis 600 akan muncul di keduanya tanda kurung 'bawah' dan 'rata-rata'. Versi Anda akan menempatkan 600 di braket 'bawah', tetapi masih bisa diperdebatkan di mana seharusnya; Saya pikir itu harus 'rata-rata' dari definisi lain, tetapi tidak jelas. Tidak ada tanda kurung dalam pertanyaan untuk skor kurang dari 500, tetapi jika Anda memiliki salah satunya, maka kode Anda saat ini akan memasukkannya ke dalam tanda kurung 'rata-rata', karena nilainya kurang dari 700 tetapi tidak antara 500 dan 600.

Jadi saya akan menafsirkannya sebagai:

SELECT * FROM (
  SELECT case
           when CREDITSCORE >= 500 and CREDITSCORE < 600 then 'LOWER RANGE(500-600)'
           when CREDITSCORE >= 600 and CREDITSCORE < 700 then 'AVERAGE RANGE(600-700)'
           when CREDITSCORE >= 700 then 'PREMIUM RANGE(700+)'
    end as CREDITSCORE_RANGE,
    state
  FROM customer
) 
PIVOT (
  count(state) FOR state IN ('PA' as pa, 'CA' as ca, 'NY' as ny, 'MD' as md)
);

Judul pertanyaan Anda mengacu pada ROLLUP, dan untuk mendapatkan total baris Anda dapat menggunakan fungsi itu:

SELECT creditscore_range, sum(pa) AS pa, sum(ca) AS ca, sum(ny) AS ny, sum(md) AS md
FROM (
  SELECT * FROM (
    SELECT CASE
             WHEN creditscore >= 500 AND creditscore < 600 THEN 'LOWER RANGE(500-600)'
             WHEN creditscore >= 600 AND creditscore < 700 THEN 'AVERAGE RANGE(600-700)'
             WHEN creditscore >= 700 THEN 'PREMIUM RANGE(700+)'
      END AS creditscore_range,
      state
    FROM customer
  ) 
  PIVOT (
    COUNT(state) FOR state IN ('PA' AS pa, 'CA' AS ca, 'NY' AS ny, 'MD' AS md)
  )
)
GROUP BY ROLLUP (creditscore_range);

Jika Anda memiliki skor di bawah 500, Keduanya akan menyertakan baris untuk mereka yang memiliki creditscore_range sebagai nol; yang membingungkan dengan ROLLUP Versi:kapan. Anda mungkin ingin memfilter skor apa pun yang kurang dari 500 dari kueri terdalam, tetapi sekali lagi tidak jelas apakah itu perlu atau diinginkan.

Saya tidak yakin bahwa tugas sedang dicari ketika berbicara tentang peringkat. Itu berarti mengubah urutan kolom berdasarkan nilai yang dikandungnya. Peringkat menurut negara bagian akan lebih masuk akal jika data diputar ke arah lain.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Format Tanggal Oracle

  2. Pemicu:bagaimana saya bisa menginisialisasi nilai pada tabel dengan nilai pada yang lain?

  3. SQL tidak mengenali alias kolom di mana klausa

  4. Mendapatkan buffer keluaran dari DBMS_OUTPUT.GET_LINES di C#

  5. Setara dengan tabel eksternal Oracle di SQL Server