【问题标题】:I need a new line with the sum of the previous lines我需要一个包含前几行总和的新行
【发布时间】:2018-04-27 09:47:38
【问题描述】:

我想要所有表格行,并且每当银行字段中的值更改为带有字段小计的新行时:value1、value2、value3

我想使用 SQL 查询执行以下操作:

Create Table #MyTable (
    bank nvarchar(255),
    account nvarchar(255),
    value1 decimal(18,2),
    value2 decimal(18,2),
    value3 decimal(18,2),
);

INSERT INTO #MyTable
  (bank, account, value1, value2, value3)
VALUES
  ('VR-Bank', 'Kto-A', 1, 2, 3),
  ('VR-Bank', 'Kto-B', 3, 2, 1),
  ('VR-Bank', 'Kto-C', 4, 4, 5),
  ('NOSPA', 'Kto-X', 1, 1, 1),
  ('NOSPA', 'Kto-Y', 4, 3, 2);

我想要没有先前总和的总和,因为这些值已经存在

Select 
    bank,
    account,
    SUM(value1), -- I would like this without SUM()
    SUM(value2),
    SUM(value3)
from #MyTable
GROUP BY 
    GROUPING SETS ((bank), (account)) -- Without summing up this does not work

-- NULL Kto-A   1.00    2.00    3.00
-- NULL Kto-B   3.00    2.00    1.00
-- NULL Kto-C   4.00    4.00    5.00
-- NULL Kto-X   1.00    1.00    1.00
-- NULL Kto-Y   4.00    3.00    2.00
-- NOSPA    NULL    5.00    4.00    3.00
-- VR-Bank  NULL    8.00    8.00    9.00

我想实现以下目标:

-- ======================================

-- VR-Bank  Kto-A   1.00    2.00    3.00 -- here also the value for the bank
-- VR-Bank  Kto-B   3.00    2.00    1.00
-- VR-Bank  Kto-C   4.00    4.00    5.00
-- VR-Bank  NULL    8.00    8.00    9.00 -- here the SUM
-- NOSPA    Kto-X   1.00    1.00    1.00
-- NOSPA    Kto-Y   4.00    3.00    2.00
-- NOSPA    NULL    5.00    4.00    3.00 -- SUM for the next bank

Drop Table #MyTable;

我希望有人可以帮助我。

【问题讨论】:

  • GROUP BY GROUPING SETS ((bank, account), (bank))?
  • 非常感谢,很合适。我之前尝试过 GROUP BY、ROLLUP、CUBE 等。当然,我还必须计算总和,这样 GROUPING SETS 才能正常工作。问题已为我解答。

标签: sql sql-server


【解决方案1】:

试试这个:

Select 
    bank,
    account,
    SUM(value1) value1, 
    SUM(value2) value2,
    SUM(value3) value3
from #MyTable
GROUP BY 
    GROUPING SETS ((bank, account, value1, value2, value3), (bank)) -- 

应该相当于:

select *
from (
    select * from #MyTable
    union all
    Select 
        bank,
        NULL account,
        SUM(value1) value1, 
        SUM(value2) value2,
        SUM(value3) value3
    from #MyTable
    GROUP BY bank
) x
order by 1, 2 desc

但第一个性能更高

【讨论】:

    【解决方案2】:

    如果您想要原始行并使用 grouping sets 将它们组合起来,请首先向表中添加唯一 id:

    Create Table #MyTable (
        mytableId int identity(1, 1) primary key,
        bank nvarchar(255),
        account nvarchar(255),
        value1 decimal(18,2),
        value2 decimal(18,2),
        value3 decimal(18,2),
    );
    

    根据测量值来确保行是唯一的,我会感到不舒服。

    那么你可以简单地做:

    select bank, id, max(account) as account,
           sum(value1) as value1, sum(value2) as value2, sum(value3) as value3
    from #MyTable
    group by grouping sets ( (bank, id), (bank) );
    

    如果您的意图是 bank/account 在组合中是唯一的,那么您可以这样做:

    SELECT bank,account,
           SUM(value1), -- I would like this without SUM()
           SUM(value2),
           SUM(value3)
    FROM #MyTable
    GROUP BY GROUPING SETS ((bank, account), (account));
    

    【讨论】:

      【解决方案3】:
      SELECT (CASE WHEN GROUPING(bank) = 0 
                   AND  GROUPING(account) = 1 
                   THEN 'Total ' + bank
                   ELSE bank
              END) AS bank,
              account,
              SUM(value1) AS value1,
              SUM(value2) AS value2,
              SUM(value3) AS value3
      FROM MyTable 
      GROUP BY GROUPING SETS((bank, account,value1, value2, value3),
                             (bank)
                            );
      

      输出

      bank            account value1  value2  value3
      NOSPA           Kto-X   1       1       1
      NOSPA           Kto-Y   4       3       2
      Total NOSPA     (null)  5       4       3
      VR-Bank         Kto-A   1       2       3
      VR-Bank         Kto-B   3       2       1
      VR-Bank         Kto-C   4       4       5
      Total VR-Bank   (null)  8       8       9
      

      演示

      http://sqlfiddle.com/#!18/2c3b9/14

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        相关资源
        最近更新 更多