【问题标题】:Sum each column in SQL and show them in Row对 SQL 中的每一列求和并在行中显示它们
【发布时间】: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 功能。

【问题讨论】:

    标签: sql sql-server count sum 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
      

      【讨论】:

      • 谢谢。喜欢简单。如果列的数据类型是布尔值而不是整数,也可以使用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2019-10-14
      • 2018-12-08
      相关资源
      最近更新 更多