WHERE句が異なる2つのSELECTクエリをマージする


9

サービステーブルが1つあります。2つのSELECTクエリをマージする必要があります。どちらにも異なるwhere句があります。例えば

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

これは私に結果を与えます

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

別のクエリがあります

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

結果が出ます

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

両方の結果をマージして、DFC列の横にClosedServicesを表示する必要があります。


不整合があります-2番目のクエリはClosedYesterdayという列を生成しますが、サンプルデータはClosedServicesを示しています。
マイケルグリーン

「マージ」とはどういう意味ですか?
philipxy

回答:


15

現在の2つのクエリの結果セットをテーブルとして扱い、それらを結合します。

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

私がこれまでに書いたSQLの最もかっこいい部分ではありませんが、うまくいけば、それがどのように機能し、それを維持する方法を理解できるでしょう。

よりパフォーマンスの高いクエリはSELECT、U_REGNでグループ化されたOSCLからの単一のクエリであり、3つのカウンタのそれぞれが、SUM(CASE ...)現在DFCで実行しているのと同様の個別のステートメントとして機能していると思います。これは、インデックスとスキーマに応じて、多くても1つのテーブルスキャンになります。


2
1つのサブクエリに他の結果がない結果がある場合はどうなりますか?ここで完全外部結合が実際に必要だと思います。
Simon Righarts、2014

@Simon-公正なポイントですが、それはOPの所定のシナリオではありませんでした。
Michael Green

ありがとう、これは私が欲しかったものです、ありがとう!また、@ SimonRighartsにも感謝します。内部結合では、意図したすべての結果が表示されなかったため、完全外部結合を使用し、完全に機能しました:)
TheSarfaraz

6

マイケルの提案を基にして:

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
Simonに感謝しますが、@ Michael Greenの完全外部結合を使用したクエリを使用しました。このクエリでは、オープンサービスやクローズドサービスがないリージョンも含まれるためです。
TheSarfaraz 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.