SQL 为每个 属性 添加总和行
SQL Add total sum row for each property
我正在尝试为每个州创建一个新的总和行。
样本table:
| State | Item | Amount
A X 100
B Y 200
A Z 100
B X 150
结果:
| State | Item | Amount
A X 100
A Z 100
Total A 200
B Y 200
B X 150
Total B 350
是否有 SQL 查询可用于执行 table
SQL 不能用作 excel 文件,它主要用于存储和处理数据。如果您想将该数据(总计)存储在 SQL 中,我认为最好的方法是创建另一个 table,您可以在其中保存总计。
如果您只是尝试在屏幕上打印总数,您可以查看 link https://www.w3schools.com/sql/sql_count_avg_sum.asp
试试下面的查询。
SELECT * FROM states_YourtableName
UNION
SELECT 'Total '+[state] State ,'' Item ,SUM(Amount) Amount
FROM states_YourtableName GROUP BY [State]
您将得到如下输出
state Item Amount
A X 100
A Z 100
B X 150
B Y 200
Total A 200
Total B 350
在 SQL 服务器中,您可以在 GROUP BY
子句上使用 ROLLUP
来获取按字段分组的中间和总和。在您的情况下,您将按状态和项目分组以获取所有行:
SELECT CASE WHEN State IS NULL THEN 'Grand Total'
WHEN Item IS NULL THEN CONCAT('Total ', State)
ELSE State
END AS State,
Item,
SUM(Amount) AS Amount
FROM data
GROUP BY ROLLUP(State, Item)
输出:
State Item Amount
A X 100
A Z 100
Total A (null) 200
B X 150
B Y 200
Total B (null) 350
Grand Total (null) 550
最简单的方法是 UNION ALL
。如果足以显示状态而不是 'Total <state>',则变为:
select state, item, amount from mytable
union all
select state, null, sum(amount) from mytable group by state
order by state, case when item is null then 2 else 1 end, item;
结果:
State | Item | Amount
------+------+-------
A | X | 100
A | Z | 100
A | | 200
B | Y | 200
B | X | 150
B | | 350
您可以将 group by 与 Rollup 一起使用
试试这个 -
declare @Data table
([State] varchar(20), Item varchar(20), Amount int )
Insert into @Data
values
( 'A', 'X', 100),
( 'B', 'Y', 200),
( 'A', 'Z', 100),
( 'B', 'X', 150)
Select [State], Item, Sum(Amount) Amount
From @Data
Group by [State], Item with Rollup
我推荐grouping sets
。它提供了比 rollup
:
更多的控制
select state, coalesce(item, 'Total') as item,
sum(amount) as amount
from t
group by grouping sets ( (state, item), (state) );
我正在尝试为每个州创建一个新的总和行。
样本table:
| State | Item | Amount
A X 100
B Y 200
A Z 100
B X 150
结果:
| State | Item | Amount
A X 100
A Z 100
Total A 200
B Y 200
B X 150
Total B 350
是否有 SQL 查询可用于执行 table
SQL 不能用作 excel 文件,它主要用于存储和处理数据。如果您想将该数据(总计)存储在 SQL 中,我认为最好的方法是创建另一个 table,您可以在其中保存总计。
如果您只是尝试在屏幕上打印总数,您可以查看 link https://www.w3schools.com/sql/sql_count_avg_sum.asp
试试下面的查询。
SELECT * FROM states_YourtableName
UNION
SELECT 'Total '+[state] State ,'' Item ,SUM(Amount) Amount
FROM states_YourtableName GROUP BY [State]
您将得到如下输出
state Item Amount
A X 100
A Z 100
B X 150
B Y 200
Total A 200
Total B 350
在 SQL 服务器中,您可以在 GROUP BY
子句上使用 ROLLUP
来获取按字段分组的中间和总和。在您的情况下,您将按状态和项目分组以获取所有行:
SELECT CASE WHEN State IS NULL THEN 'Grand Total'
WHEN Item IS NULL THEN CONCAT('Total ', State)
ELSE State
END AS State,
Item,
SUM(Amount) AS Amount
FROM data
GROUP BY ROLLUP(State, Item)
输出:
State Item Amount
A X 100
A Z 100
Total A (null) 200
B X 150
B Y 200
Total B (null) 350
Grand Total (null) 550
最简单的方法是 UNION ALL
。如果足以显示状态而不是 'Total <state>',则变为:
select state, item, amount from mytable
union all
select state, null, sum(amount) from mytable group by state
order by state, case when item is null then 2 else 1 end, item;
结果:
State | Item | Amount ------+------+------- A | X | 100 A | Z | 100 A | | 200 B | Y | 200 B | X | 150 B | | 350
您可以将 group by 与 Rollup 一起使用
试试这个 -
declare @Data table
([State] varchar(20), Item varchar(20), Amount int )
Insert into @Data
values
( 'A', 'X', 100),
( 'B', 'Y', 200),
( 'A', 'Z', 100),
( 'B', 'X', 150)
Select [State], Item, Sum(Amount) Amount
From @Data
Group by [State], Item with Rollup
我推荐grouping sets
。它提供了比 rollup
:
select state, coalesce(item, 'Total') as item,
sum(amount) as amount
from t
group by grouping sets ( (state, item), (state) );