我正在編寫一個查詢,它分爲兩列。這意味着,它會將Col1和Col2放入同一組。按多列分組,SUM在第一個分組按列
我該如何做基於組Col1的記錄SUM?
我有這個至今:http://sqlfiddle.com/#!3/eada2/1
謝謝
我正在編寫一個查詢,它分爲兩列。這意味着,它會將Col1和Col2放入同一組。按多列分組,SUM在第一個分組按列
我該如何做基於組Col1的記錄SUM?
我有這個至今:http://sqlfiddle.com/#!3/eada2/1
謝謝
我能夠如下解決這個問題:
WITH cteActivityIds (activityId, allDocuByActivity)
AS
(SELECT activityId, COUNT(*) AS allDocuByActivity FROM #ER GROUP BY activityId)
SELECT
E.activityId AS [Actiivty ID],
docuType AS [Docu Type],
COUNT(docuType),
CONVERT(DECIMAL(16,2), (COUNT(docuType) * 100.00/t.allDocuByActivity)) [Total DocuType in Activity],
SUM(CASE WHEN [sent] != '1-1-1900' THEN 1 END) AS [Sent],
SUM(CASE WHEN [approved] != '1-1-1900' THEN 1 END) AS [Approved]
FROM
#ER AS E
INNER JOIN cteActivityIds AS t
ON E.activityId = t.activityId
GROUP BY
E.activityId, docuType, t.allDocuByActivity
感謝
這裏是一個解決方案,在我意見,看起來有點清潔 - 它不需要連接並使用「分區依據」來計算個人計數:
WITH activityCounts as (
select
activityId,
docuType,
count(activityId) OVER(PARTITION BY activityId) as activityIdCount,
count(docuType) OVER(PARTITION BY activityId, docuType) as docuTypeCount,
SUM(CASE WHEN [sent] != '1-1-1900' THEN 1 END) OVER(PARTITION BY activityId, docuType) AS [Sent],
SUM(CASE WHEN [approved] != '1-1-1900' THEN 1 END) OVER(PARTITION BY activityId, docuType) AS [Approved]
from ER
)
SELECT
activityId,
docuType,
docuTypeCount,
CONVERT(DECIMAL(16,2), (COUNT(docuTypeCount) * 100.00/activityIdCount)) as [Total DocuType in Activity],
[Sent],
[Approved]
FROM activityCounts
GROUP BY
activityId,
docuType,
activityIdCount,
docuTypeCount,
[Sent],
[Approved]
這裏是一個link to sqlfiddle
你只需要把一個聚合函數上t.allDocuByActivity
MIN(t.allDocuByActivity) AS [Total DocuType in Activity],
然而,由於您的標籤是DocuType
。你不需要DISTINCT
?
你想要的輸出是什麼? – 2013-03-17 05:52:10
對於每一行,我想顯示單個活動標識內的docuType的總數。 – Bill 2013-03-17 05:57:42