我正在编写一个查询,它分为两列。这意味着,它会将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