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

Kembalikan nilai nol ketika tidak ada data baris

Pertama, tulis ulang kueri Anda. Gunakan tampilan atau ekspresi tabel umum untuk menghindari pengulangan diri Anda tiga kali untuk SELECT . Anda , GROUP BY , ORDER BY klausa. Kueri Anda menjadi:

WITH data AS (
    SELECT(CASE WHEN time_dtm > SYSDATE -1 THEN '0-1 day'
                WHEN time_dtm > SYSDATE -2 AND 
                     time_dtm < SYSDATE -1 THEN '1-2 days'
                WHEN time_dtm > SYSDATE -3 AND 
                     time_dtm < SYSDATE -2 THEN '2-3 days'
                WHEN time_dtm > SYSDATE -4 AND 
                     time_dtm < SYSDATE -3 THEN '3-4 days'
                WHEN time_dtm > SYSDATE -5 AND 
                     time_dtm < SYSDATE -4 THEN 'Closed'
           END) AS Age 
    FROM table_1 
    WHERE id IN (1,2,3)
)
SELECT Age, COUNT(*)
FROM data
GROUP BY Age
ORDER BY Age

Kemudian, untuk memastikan bahwa salah satu grup yang Anda inginkan akan tersedia di hasil, Anda memiliki banyak opsi.

Anda dapat menggunakan UNION ALL :

WITH data AS (
    SELECT(CASE WHEN time_dtm > SYSDATE -1 THEN '0-1 day'
                WHEN time_dtm > SYSDATE -2 AND 
                     time_dtm < SYSDATE -1 THEN '1-2 days'
                WHEN time_dtm > SYSDATE -3 AND 
                     time_dtm < SYSDATE -2 THEN '2-3 days'
                WHEN time_dtm > SYSDATE -4 AND 
                     time_dtm < SYSDATE -3 THEN '3-4 days'
                WHEN time_dtm > SYSDATE -5 AND 
                     time_dtm < SYSDATE -4 THEN 'Closed'
           END) AS Age 
    FROM table_1 
    WHERE id IN (1,2,3)

    -- The below will add one record for every desired Age group
    UNION ALL
    SELECT '0-1 day'  FROM DUAL UNION ALL
    SELECT '1-2 days' FROM DUAL UNION ALL
    SELECT '2-3 days' FROM DUAL UNION ALL
    SELECT '3-4 days' FROM DUAL UNION ALL
    SELECT 'Closed'   FROM DUAL
)
SELECT Age, COUNT(*) - 1 -- Subtract the extra record again
FROM data
GROUP BY Age
ORDER BY Age

Solusi yang sama sekali berbeda akan melibatkan LEFT OUTER JOINs :

-- Groups is a dynamic table that contains the date ranges and their "Age" label
WITH groups AS (
    SELECT SYSDATE -1 lower, SYSDATE upper, '0-1 day'  Age FROM DUAL UNION ALL
    SELECT SYSDATE -2      , SYSDATE -1   , '1-2 days'     FROM DUAL UNION ALL
    SELECT SYSDATE -3      , SYSDATE -2   , '2-3 days'     FROM DUAL UNION ALL
    SELECT SYSDATE -4      , SYSDATE -3   , '3-4 days'     FROM DUAL UNION ALL
    SELECT SYSDATE -5      , SYSDATE -4   , 'Closed'       FROM DUAL
)
SELECT g.Age, NVL(SUM(t.counter), 0)
FROM groups g

-- LEFT OUTER JOINing "table_1" to "groups" will ensure that every group
-- appears at least once in the result
LEFT OUTER JOIN (
  SELECT 1 counter, t.* FROM table_1 t WHERE t.id IN (1,2,3)
) t
ON  t.time_dtm >= g.lower
AND t.time_dtm <  g.upper
GROUP BY g.Age
ORDER BY g.Age

Pada contoh kedua, Anda juga dapat melakukannya tanpa CTE dan menggunakan SELECT bersarang untuk groups meja. Sangat mudah untuk melihat bagaimana contoh kedua lebih mudah untuk dikembangkan di masa depan, jika persyaratan Anda berubah.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hubungkan OEM Anda ke Grafana menggunakan Aplikasi Manajer Perusahaan untuk Grafana

  2. org.hibernate.ObjectDeletedException:objek yang dihapus akan disimpan kembali oleh kaskade (hapus objek yang dihapus dari asosiasi)

  3. ora-01722 nomor tidak valid menggunakan count(1) pada operator minus dua tampilan

  4. Tidak mendapatkan perkalian seri penuh (produk) dalam permintaan CONNECT-BY

  5. Permintaan Oracle untuk mengubah beberapa kolom menjadi satu kolom