簡體   English   中英

組合兩個查詢以獲取分子,分母和分組

[英]Combining two queries to get numerator, denominator, and grouping

我有兩個查詢。 一種用於分子,另一種用於分母。 如何合並這兩個查詢,以便我的結果是一個包含分子,分母和分組的表?

查詢和結果

所需輸出示例:

Numerator | Denominator | Grouping
----------|-------------|---------
 30       | 51          | 1111
172       | 216         | 2768

使用聯接:

Select numerator.Count, denominator.Count, numerator.officerID  from (SELECT COUNT() as Count, officerID FROM [dbo].[cobanVideos] WHERE starting > '6/1/2015 0:00:00 AM' AND starting < '7/1/2015 0:00:00 AM' AND ST3ID != '' GROUP BY officerID) numerator Join (SELECT COUNT() as Count, officerID FROM [dbo].[cobanVideos] WHERE starting > '6/1/2015 0:00:00 AM' AND starting < '7/1/2015 0:00:00 AM' GROUP BY officerID) denominator On numerator.officerId = denominator.officerId

您實際上在同一個表上有兩個不同的聚合。 由於許多原因,性能是其中之一,因此您不想將查詢分為兩部分,然后將它們重新結合在一起。 您可以通過使用列級過濾而不是WHERE子句過濾來完成正確的結果:

select [officerID]
    ,sum(case when [ST3ID] != '' then 1 else 0 end) as [Numerator]
    ,count(*) as [Denomimator]
FROM [dbo].[cobanVideos]
WHERE [starting] > '6/1/2015 0:00:00 AM'
AND [starting] < '7/1/2015 0:00:00 AM'
GROUP BY [officerID]

通過使用CASE語句在列級別過濾數據,您可以同時檢索兩個值。 您還可以通過添加以下內容作為附加列來計算百分比值(分子/分子):

select [officerID]
    ,sum(case when [ST3ID] != '' then 1 else 0 end) as [Numerator]
    ,count(*) as [Denomimator]
    ,case when count(*) <> 0 
          then sum(case when [ST3ID] != '' then 1.0 else 0 end) / count(*)
          else 0 
      end as [Pct ST3]
FROM [dbo].[cobanVideos]
WHERE [starting] > '6/1/2015 0:00:00 AM'
AND [starting] < '7/1/2015 0:00:00 AM'
GROUP BY [officerID]

SQL Window函數為您提供了另一整套工具,用於在一個查詢中處理不同聚合級別的聚合。 如果您有興趣,我可以舉一個示例,說明如何使用一個SELECT來計算所有人員的每個OfficerId的比率,並確定每個人員占總人數的百分比。

為了獲得所需的結果,您必須使用案例陳述

這是例子

SELECT 
SUM(CASE WHEN ST3ID != '' THEN 1 ELSE 0 END)    [NUMERATOR] ,
COUNT(*)                                        [DENOMINATOR],
officerID                                       [GROUPING]
FROM [dbo].[cobanVideos]
WHERE [starting] > '6/1/2015 0:00:00 AM'
AND [starting] < '7/1/2015 0:00:00 AM'
GROUP BY GROUPINGID

對於您的問題的答案,必須使用Join語句

例:

SELECT 
    ISNULL(numerator,0)             as [Numerator], 
    ISNULL(Denominator,0)           as [Denominator], 
    ISNULL(a.officerID,b.officerID) as [Grouping] 
FROM 
(SELECT COUNT(*) numerator, officerID ....) AS [TableA]
FULL JOIN 
(SELECT COUNT(*) Denominator, officerID ....) AS [TableB]
ON [TableA].[officerID] = [TableB].[officerID]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM