[英]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.