对 SQL 中的每一列求和并在行中显示它们
Posted
技术标签:
【中文标题】对 SQL 中的每一列求和并在行中显示它们【英文标题】:Sum each column in SQL and show them in Row 【发布时间】:2020-10-03 10:51:19 【问题描述】:我有一个如下表“任务”
其中 ID 是唯一记录,deptA.....deptD 是部门。 1 表示已完成,0 表示未完成。 我想计算每个部门的总和如下
我正在尝试像下面那样做,但我不知道如何转置到行
select Sum(deptA) as deptA,
Sum(deptB) as deptB,
Sum(deptC) as deptC,
Sum(deptD) as deptD,
count(*) as total
from task
注意 - 因为我的应用程序不支持它,所以不能使用 pivot/unpivot 功能。
【问题讨论】:
【参考方案1】:您可以使用cross apply
取消透视,然后聚合:
select x.dept, sum(x.status) complete, sum(1 - x.status) incomplete
from task t
cross apply (values
('deptA', deptA), ('deptB', deptB), ('deptC', deptC), ('deptD', deptD)
) x(dept, status)
group by x.dept
这仅假定部门列中的 0
/1
值,这简化了聚合逻辑。
【讨论】:
【参考方案2】:一个选项是Conditional Aggregation
和UNION ALL
,以便根据需要取消数据透视:
SELECT 'DeptA' AS "Depatments", SUM(CASE WHEN deptA= 1 THEN 1 ELSE 0 END) AS "Completed", SUM(CASE WHEN deptA= 0 THEN 1 ELSE 0 END) AS "Incomplete"
FROM task
UNION ALL
SELECT 'DeptB', SUM(CASE WHEN deptB= 1 THEN 1 ELSE 0 END), SUM(CASE WHEN deptB= 0 THEN 1 ELSE 0 END)
FROM task
UNION ALL
SELECT 'DeptC', SUM(CASE WHEN deptC= 1 THEN 1 ELSE 0 END), SUM(CASE WHEN deptC= 0 THEN 1 ELSE 0 END)
FROM task
UNION ALL
SELECT 'DeptD', SUM(CASE WHEN deptD= 1 THEN 1 ELSE 0 END), SUM(CASE WHEN deptD= 0 THEN 1 ELSE 0 END)
FROM task
【讨论】:
谢谢。喜欢简单。如果列的数据类型是布尔值而不是整数,也可以使用以上是关于对 SQL 中的每一列求和并在行中显示它们的主要内容,如果未能解决你的问题,请参考以下文章
如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?