【问题标题】:How do I do a ROLLUP on Language column and get a row of TOTAL as the last row?如何对 Language 列进行 ROLLUP 并获得 TOTAL 行作为最后一行?
【发布时间】:2018-01-24 19:50:03
【问题描述】:

我想对 Language 列进行 ROLLUP 并将最后一行生成为 Total。
我不确定将 ROLLUP 放在哪里。
例如:

AS
        BEGIN
            declare @sqlCommand NVARCHAR(4000) =
            'SELECT Language, col2, col3, col4, Total = col2 + col3 + col4
            FROM (  SELECT xL.lN, xS.sN, UC.UC
                    FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS
                    ON UC.ssn = xS.ssn
                    WHERE
                        ((DS BETWEEN .... AND ....) AND
                        (HS BETWEEN .... AND ....) AND
                        (MS BETWEEN .... AND ....))) UCs
                        PIVOT (SUM (UC) for sN IN
                        (col2, col3, col4))
                        AS PVT;';
        EXEC SP_EXECUTESQL @sqlCommand
        END

【问题讨论】:

    标签: sql sql-server stored-procedures rollup


    【解决方案1】:

    使用Group by.. 完成汇总,如果您必须在此处应用分组,则需要按您选择的所有列分组。

    【讨论】:

      【解决方案2】:

      您可以尝试分组。

      With result as (
          SELECT Language, col2, col3, col4, Total = col2 + col3 + col4
          FROM (  SELECT xL.lN, xS.sN, UC.UC
                  FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS
                  ON UC.ssn = xS.ssn
                  WHERE
                  ((DS BETWEEN .... AND ....) AND
                  (HS BETWEEN .... AND ....) AND
                  (MS BETWEEN .... AND ....))
          ) UCs
          PIVOT (SUM (UC) for sN 
              IN (col2, col3, col4)
          ) AS PVT
      )
      SELECT Language, col2, col3, col4, sum(Total) as Total
      FROM result
      GROUP BY GROUPING SETS((Language, col2, col3, col4), ())
      

      【讨论】:

      • 谢谢。该解决方案有所帮助,但我仍然将最后一行设为 NULL。它增加了一行
      • @syang 不过,我将最后一行设为 NULL。 RANGE = [2], [3], [4], [5] SELECT Server, ' + RANGE + ', sum(Total) as Total FROM result GROUP BY GROUPING SETS((Server, ' + RANGE + '), ( ));';你能帮我进一步解决这个问题吗?
      • 我不清楚你的意思。你能把最后一行的想法输出的示例结果集放在一起吗?
      【解决方案3】:

      如果您尝试使用每列的总和来获取行总数,您可以尝试以下查询:

      --方法一:

      With result as (
          SELECT Language, col2, col3, col4, Total = col2 + col3 + col4
          FROM (  SELECT xL.lN, xS.sN, UC.UC
                  FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS
                  ON UC.ssn = xS.ssn
                  WHERE
                  ((DS BETWEEN .... AND ....) AND
                  (HS BETWEEN .... AND ....) AND
                  (MS BETWEEN .... AND ....))
          ) UCs
          PIVOT (SUM (UC) for sN 
              IN (col2, col3, col4)
          ) AS PVT
      )
      SELECT Language, col2, col3, col4, sum(Total) as Total
      FROM result
      UNION ALL
      SELECT 'TOTAL', sum(col2) as col2, sum(col3) as col3, cum(col4) as col4, sum(Total) as Total
      FROM result
      

      --方法二:

      With result as (
          SELECT Language, col2, col3, col4, Total = col2 + col3 + col4
          FROM (  SELECT xL.lN, xS.sN, UC.UC
                  FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS
                  ON UC.ssn = xS.ssn
                  WHERE
                  ((DS BETWEEN .... AND ....) AND
                  (HS BETWEEN .... AND ....) AND
                  (MS BETWEEN .... AND ....))
          ) UCs
          PIVOT (SUM (UC) for sN 
              IN (col2, col3, col4)
          ) AS PVT
      )
      SELECT case when grouping(Language) = 1 then 'Total' else Language end as Language
      , sum(col2) as col2
      , sum(col3) as col3
      , sum(col4) as col4
      , sum(Total) as Total
      from result
      group by Language with Rollup
      order by grouping(Language)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2022-10-21
        • 2014-08-04
        相关资源
        最近更新 更多