【问题标题】:How to show Sub Total value like this?如何显示这样的小计值?
【发布时间】:2019-03-25 21:00:26
【问题描述】:

我有一张这样的桌子:-

Branch       SL       Month     Amount1 Amount2 Amount3
    A         1       January    100       0        0
    A         2       February     0       0        0
    A         3       March       80       0        0
    A         4       April        0      10       10
    A         5       May          0       0        0
    A         6       June         0       0        0
    A         7       July         0       0       10
    A         8       August       0      10        0
    A         9       September    0      10        0
    A        10       October     40       0       10
    A        11       November    10      10       10
    A        12       December     0      10       10
    B         1       January      0       0       10
    B         2       February    10      10       10
    B         3       March        0       0       10

现在,我正在尝试按每个分支显示小计,这将给出这样的输出,其中每 12 行之后显示“Subtotal”,并且在月份列“Subtotal”的正下方写入。并且前 2 列将是空白的,我正在尝试使用 UNION ALL 来实现这一点,但失败了。

Branch  SL    Month   Amount1     Amount2    Amount3
A        1    January     100           0          0
A        2    February      0           0          0
A        3    March        80           0          0
A        4    April         0          10         10
A        5    May           0           0          0
A        6    June          0           0          0
A        7    July          0           0         10
A        8    August        0          10          0
A        9    September     0          10          0
A        10   October      40           0         10
A        11   November     10          10         10
A        12   December      0          10         10
              Subtotal    230          50         50
B        1    January       0           0         10
B        2    February     10          10         10
B        3    March         0           0         10

【问题讨论】:

  • 您不能在 SQL 中添加总计或小计行。为此使用报告工具。那些通常有组页眉和页脚。例如。在页眉中您将显示年份或分支(或您分组的任何内容),在页脚中显示小计。

标签: sql sql-server database sql-server-2005


【解决方案1】:

一种方法使用grouping sets,但您需要聚合查询。你可以这样写:

select Branch, SL, Month, sum(Amount1), sum(Amount2), sum(Amount3)
from t
group by grouping sets ( (Branch, SL, Month), (branch) );

grouping sets 仅在 2008 年以后可用。在早期版本中,您可以:

select t.*
from ((select branch, sl, month, amount1, amount2, amount3
       from t
      ) union all
      (select Branch, null, 'Subtotal', sum(Amount1), sum(Amount2), sum(Amount3)
       from t
       group by branch
      )
     ) t
order by branch,
         (case when sl is not null then 1 else 2 end),
         sl;

【讨论】:

  • 我必须使用 SQL Server 2005,兼容吗?
  • 将第二个子查询中的第二个NULL替换为'Subtotal'
【解决方案2】:

试试这个

CREATE TABLE T
(
   Branch VARCHAR(1),
   SL INT,
   Month VARCHAR(3),
   Amount1 INT,
   Amount2 INT,
   Amount3 INT
);

INSERT INTO T VALUES
('A', 1, 'Jan', 10, 0, 10),
('A', 2, 'Feb', 20, 0, 20),
('B', 1, 'Jan', 5, 5, 5),
('B', 2, 'Feb', 20, 0, 20),
('C', 1, 'Jan', 55, 44, 33);

WITH CTE AS
(
  SELECT *
  FROM T
  UNION ALL
  SELECT Branch + ' SubTotal', NULL, 'SubTotal', SUM(Amount1), SUM(Amount2), SUM(Amount3)
  FROM T
  GROUP BY Branch
)
SELECT Branch,
       SL,
       Month,
       Amount1,
       Amount2,
       Amount3
FROM CTE
ORDER BY Branch;

结果:

+------------+----+----------+---------+---------+---------+
|   Branch   | SL |  Month   | Amount1 | Amount2 | Amount3 |
+------------+----+----------+---------+---------+---------+
| A          |  1 | Jan      |      10 |       0 |      10 |
| A          |  2 | Feb      |      20 |       0 |      20 |
| A SubTotal |    | SubTotal |      30 |       0 |      30 |
| B          |  1 | Jan      |       5 |       5 |       5 |
| B          |  2 | Feb      |      20 |       0 |      20 |
| B SubTotal |    | SubTotal |      25 |       5 |      25 |
| C          |  1 | Jan      |      55 |      44 |      33 |
| C SubTotal |    | SubTotal |      55 |      44 |      33 |
+------------+----+----------+---------+---------+---------+

如果你真的需要得到BranchSL 空白(''),你可以这样做

WITH CTE AS
(
  SELECT Seq = Branch + 'X1',*
  FROM T
  UNION ALL
  SELECT Branch + 'X2', '', NULL, 'SubTotal', SUM(Amount1), SUM(Amount2), SUM(Amount3)
  FROM T
  GROUP BY Branch
)
SELECT Branch,
       SL,
       Month,
       Amount1,
       Amount2,
       Amount3
FROM CTE
ORDER BY Seq;

结果和你预期的一样

+--------+----+----------+---------+---------+---------+
| Branch | SL |  Month   | Amount1 | Amount2 | Amount3 |
+--------+----+----------+---------+---------+---------+
| A      |  1 | Jan      |      10 |       0 |      10 |
| A      |  2 | Feb      |      20 |       0 |      20 |
|        |    | SubTotal |      30 |       0 |      30 |
| B      |  1 | Jan      |       5 |       5 |       5 |
| B      |  2 | Feb      |      20 |       0 |      20 |
|        |    | SubTotal |      25 |       5 |      25 |
| C      |  1 | Jan      |      55 |      44 |      33 |
|        |    | SubTotal |      55 |      44 |      33 |
+--------+----+----------+---------+---------+---------+

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多