【问题标题】:How can i Query sum like this我怎样才能像这样查询总和
【发布时间】:2018-11-29 02:12:21
【问题描述】:

我有一个这样的查询

  SELECT a.code ,a.group ,a.Desc ,
         Sum(CONVERT(decimal(10,2),a.amount)) 'BYDESC'
    FROM table1 as a
   WHERE a.Bol = 'Y'
GROUP BY a.code,a.group,a.Desc
ORDER BY a.code 
         Asc ,a.group asc ,a.Desc asc

它给了我一张这样的桌子

CODE   GROUP  DESC        BYDESC
--------------------------------
G001   00001  D001          15.0
G001   00001  D002           3.0
G001   00001  D003         354.0
G001   00002  D001          27.0
   .       .     .             .
   .       .     .             .
   .       .     .             .
--------------------------------

我想对每个组求和并像这样显示

CODE   GROUP  DESC        BYDESC  Sum(BYGROUP)
---------------------------------------------
G001   00001  D001          15.0        372.0
G001   00001  D002           3.0        372.0
G001   00001  D003         354.0        372.0
G001   00002  D001          27.0         27.0
   .       .     .             .            .
   .       .     .             .            . 
   .       .     .             .            .
----------------------------------------------

【问题讨论】:

    标签: sql-server group-by sum


    【解决方案1】:

    您可以使用公用表表达式来实现此目的。
    试试这个。

    ;with sumTable 
    AS
    ( 
            SELECT a.code ,a.group ,Sum(CONVERT(decimal(10,2),a.amount)) SUMBYGROUP
              FROM table1 as a
              WHERE a.Bol = 'Y'
           GROUP BY a.code,a.group
    
    )
      SELECT a.code ,a.group ,a.Desc ,Sum(CONVERT(decimal(10,2),a.amount)) 'BYDESC', sumTable.SUMBYGROUP as 'Sum(BYGROUP)'
        FROM table1 as a
        JOIN sumTable 
          ON (
              sumTable.code = a.code And sumTable.group = a.group 
             )
       WHERE a.Bol = 'Y'
    GROUP BY a.code,a.group,a.Desc, sumTable.SUMBYGROUP
    ORDER BY a.code asc ,a.group asc ,a.Desc asc
    

    【讨论】:

    • 感谢您的回答。尝试此操作后,出现以下错误 - > 列“sumTable.SUMBYGROUP”在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。
    • @Izle 我已经编辑了我的答案,你现在可以试一试。
    【解决方案2】:
    ;with GroupedTable 
    AS
    ( 
        SELECT a.[COL1] ,a.[COL2] ,a.[COL3] ,Sum(CONVERT(decimal(10,2),a.[COL4])) 
         'BYDESC'
        FROM MyTable as a
        GROUP BY a.[COL1],a.[COL2],a.[COL3] 
    )
    
    SELECT 
        a.[COL1] ,a.[COL2] , a.[COL3] 
        ,Sum(CONVERT(decimal(10,2),a.[COL4])) 'BYDESC', mt.SUM
    FROM MyTable as a
    INNER JOIN 
    (
       SELECT gt.[COL1] ,gt.[COL2] ,Sum(CONVERT(decimal(10,2),gt.[BYDESC])) AS 'SUM'
      FROM GroupedTable as gt
      GROUP BY gt.[COL1] ,gt.[COL2] 
    ) mt ON mt.[COL1] = a.[COL1] AND mt.[COL2] = a.[COL2]
    GROUP BY a.[COL1],a.[COL2],a.[COL3], mt.SUM
    ORDER BY  a.[COL1],a.[COL2],a.[COL3], mt.SUM
    

    DB Fiddle

    【讨论】:

      【解决方案3】:

      你可以使用windows功能来实现这一点。

      with cte as
         (SELECT a.code,
              a.group,
              a.Desc,
              Sum(CONVERT(decimal(10,2),a.amount)) 'BYDESC'
              FROM table1 as a
              WHERE a.Bol = 'Y'
              GROUP BY a.code,a.group,a.Desc
             ) 
      select *, 
      sum(bydesc) over (partition by [group] order by [desc]
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
          from cte
      ORDER BY code Asc ,[group] asc , [Desc] asc
      

      【讨论】:

      • 感谢您的回答,我已经测试了您的解决方案,但似乎最后两列的结果有点奇怪:(
      • 嘿 izle,你能把所面临的问题说清楚一点吗?
      • 好吧,首先我遇到以下错误“ORDER BY 子句在视图中无效”,所以我将订单移到查询的最后一行,结果显示“sum(bydesc) over (按 CallDesc 排序的 CallGroup 分区)”的总和不正确
      • 抱歉错过了范围条件。请检查更新后的查询。
      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多