Hợp nhất hai truy vấn CHỌN với các mệnh đề WHERE khác nhau


9

Tôi có một bảng dịch vụ. Tôi cần hợp nhất hai truy vấn CHỌN. Cả hai đều có mệnh đề khác nhau. Ví dụ

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

Điều này cho tôi kết quả

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

Tôi có một truy vấn khác

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

Nó cho tôi kết quả

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

Tôi cần hợp nhất cả hai kết quả và hiển thị Dịch vụ Đóng bên cạnh cột DFC.


Có một sự không nhất quán - truy vấn thứ hai của bạn tạo ra một cột có tên là Đóng ngày hôm qua nhưng dữ liệu ví dụ cho biết Dịch vụ đã đóng.
Michael Green

"Hợp nhất" có nghĩa là gì?
philipxy

Câu trả lời:


15

Hãy coi các kết quả của hai truy vấn hiện tại của bạn dưới dạng bảng và tham gia chúng:

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

Không phải là phần đẹp nhất của SQL tôi từng viết nhưng hy vọng bạn sẽ thấy nó hoạt động như thế nào và hiểu cách duy trì nó.

Tôi nghi ngờ một truy vấn có hiệu suất tốt hơn sẽ là một truy vấn duy nhất SELECTtừ OSCL, được nhóm bởi U_REGN, với mỗi ba bộ đếm của bạn là các SUM(CASE ...)câu lệnh riêng giống với những gì bạn hiện đang làm cho DFC. Đây sẽ là một lần quét bảng, nhiều nhất, tùy thuộc vào chỉ mục và lược đồ của bạn.


2
Điều gì xảy ra khi có kết quả trong một truy vấn con không có trong truy vấn kia? Tôi nghi ngờ bạn thực sự muốn tham gia bên ngoài đầy đủ ở đây.
Simon Righarts

@Simon - điểm công bằng, nhưng đó không phải là kịch bản được đưa ra của OP.
Michael Green

Cảm ơn bạn, đây là những gì tôi muốn, Cảm ơn! Và cũng xin cảm ơn @SimonRigharts. Tham gia bên trong không cho tôi thấy tất cả các kết quả mà tôi dự định, vì vậy tôi đã sử dụng tham gia bên ngoài đầy đủ, hoạt động hoàn hảo :)
TheSarfaraz

6

Xây dựng đề xuất của 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

1
Cảm ơn Simon, nhưng tôi đã sử dụng truy vấn của @Michael Green với tham gia bên ngoài đầy đủ vì truy vấn này cung cấp cho tôi ngay cả những khu vực không có bất kỳ dịch vụ mở hoặc đóng nào!
TheSarfaraz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.