Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按多列分组,在第一列按列分组求和_Sql_Sql Server 2008_Tsql - Fatal编程技术网

Sql 按多列分组,在第一列按列分组求和

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 [

我正在编写一个在两列上分组的查询。这意味着,它将把Col1和Col2放在同一组中

如何根据组Col1计算记录的总和

到目前为止,我有:


谢谢

我可以按如下方式解决它:

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中的文档类型总数。