Sql 按多列分组,在第一列按列分组求和
我正在编写一个在两列上分组的查询。这意味着,它将把Col1和Col2放在同一组中 如何根据组Col1计算记录的总和 到目前为止,我有:Sql 按多列分组,在第一列按列分组求和,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我正在编写一个在两列上分组的查询。这意味着,它将把Col1和Col2放在同一组中 如何根据组Col1计算记录的总和 到目前为止,我有: 谢谢我可以按如下方式解决它: WITH cteActivityIds (activityId, allDocuByActivity) AS (SELECT activityId, COUNT(*) AS allDocuByActivity FROM #ER GROUP BY activityId) SELECT E.activityId AS [
谢谢我可以按如下方式解决它:
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]
这里有一个您只需要在
t.alldocubyaActivity上放置一个聚合函数
MIN(t.allDocuByActivity) AS [Total DocuType in Activity],
但是,由于您的标签是
DocuType
。您不需要DISTINCT
?所需的输出是什么?对于每一行,我想显示单个活动Id中的文档类型总数。