Gabungkan dua kueri SELECT dengan klausa WHERE yang berbeda

9

Saya punya satu tabel layanan. Saya perlu menggabungkan dua pertanyaan SELECT. Keduanya memiliki klausa tempat yang berbeda. Sebagai contoh

SELECT 
  U_REGN as 'Region', 
  COUNT(callID) as 'OpenServices',
  SUM(CASE WHEN descrption LIKE '%DFC%' THEN 1 ELSE 0 END) 'DFC'
FROM OSCL
WHERE     
  ([status] = - 3) 
GROUP BY 
  U_REGN
ORDER BY 
  'OpenServices' desc

Ini memberi saya hasil

Region    | OpenServices | DFC
Karaci    | 14           | 4
Lahore    | 13           | 3
Islamabad | 10           | 4

Saya punya pertanyaan lain

SELECT 
  U_REGN as 'Region', 
  COUNT(callID) as 'ClosedYesterday'
FROM OSCL
WHERE 
  DATEDIFF(day, closeDate, GETDATE()) = 1
GROUP BY 
  U_REGN
ORDER BY 
  'ClosedYesterday' desc

Ini memberi saya hasil

Region    | ClosedServices
Karachi   | 8
Lahore    | 7
Islamabad | 4

Saya perlu menggabungkan kedua hasil, dan menampilkan ClosedServices di sebelah kolom DFC.

TheSarfaraz
sumber
Ada ketidakkonsistenan - kueri kedua Anda menghasilkan kolom bernama ClosedYesterday tetapi contoh data mengatakan ClosedServices.
Michael Green
Apa artinya "menggabungkan"?
philipxy

Jawaban:

15

Perlakukan dua hasil kueri saat ini sebagai tabel dan gabungkanlah:

select
    FirstSet.Region,
    FirstSet.OpenServices,
    FirstSet.DFC,
    SecondSet.ClosedYesterday
from 
(
    SELECT U_REGN as 'Region', COUNT(callID) as 'OpenServices',
    SUM(CASE WHEN descrption LIKE '%DFC%' THEN 1 ELSE 0 END) 'DFC'
    FROM OSCL 
    WHERE ([status] = - 3) 
    GROUP BY U_REGN 
    --ORDER BY 'OpenServices' desc
) as FirstSet
inner join
(
    SELECT U_REGN as 'Region', 
    COUNT(callID) as 'ClosedYesterday'
    FROM OSCL
    WHERE DATEDIFF(day, closeDate, GETDATE()) = 1
    GROUP BY U_REGN
    --ORDER BY 'ClosedYesterday' desc
) as SecondSet
on FirstSet.Region = SecondSet.Region
order by FirstSet.Region

Bukan bit SQL tercantik yang pernah saya tulis, tetapi mudah-mudahan Anda akan melihat cara kerjanya dan memahami cara mempertahankannya.

Saya menduga permintaan yang berkinerja lebih baik adalah tunggal SELECTdari OSCL, dikelompokkan oleh U_REGN, dengan masing-masing dari tiga penghitung Anda sebagai SUM(CASE ...)pernyataan terpisah yang serupa dengan apa yang Anda lakukan saat ini untuk DFC. Ini akan menjadi pemindaian tabel tunggal, paling banyak, tergantung Anda indeks & skema Anda.

Michael Green
sumber
2
Apa yang terjadi ketika ada hasil dalam satu subquery yang tidak ada di yang lain? Saya menduga Anda benar-benar ingin bagian luar penuh bergabung di sini.
Simon Righarts
@Simon - titik adil, tapi itu bukan skenario yang diberikan OP.
Michael Green
Terima kasih, ini yang saya inginkan, terima kasih! Dan juga Terima kasih @SimonRigharts. Gabung dalam tidak menunjukkan semua hasil yang saya maksudkan, jadi saya Menggunakan gabung luar penuh, bekerja dengan sempurna :)
TheSarfaraz
6

Membangun saran Michael:

SELECT
    U_REGN AS 'Region',
    SUM(CASE WHEN [status] = -3 THEN 1 ELSE 0 END) AS 'OpenServices',
    SUM(CASE WHEN [status] = -3 AND [description] LIKE '%DFC%' THEN 1 ELSE 0 END) AS 'DFC',
    SUM(CASE WHEN DATEDIFF(day, closeDate, GETDATE()) = 1 THEN 1 ELSE 0 END) AS 'ClosedYesterday'
FROM
    OSCL
GROUP BY 
    U_REGN
ORDER BY
    'OpenServices' desc
Simon Righarts
sumber
1
Terima kasih, Simon, tapi saya menggunakan permintaan @Michael Green dengan gabung luar penuh karena permintaan ini memberi saya bahkan wilayah yang tidak memiliki layanan terbuka atau tertutup!
TheSarfaraz