对 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 AggregationUNION 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将查询结果插入到表的每一列中

如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?

sum函数

是否可以对数组中的每 3 个相邻元素求和,并使用向量指令使它们中的每一个都等于总和?

SQL汇总了最后一行中的每一列

表格怎么设置每一列自动求和