【问题标题】:SQL Outer Join on multiple summed columns in same tableSQL Outer Join 在同一个表中的多个求和列上
【发布时间】:2012-01-12 13:07:20
【问题描述】:

我正在使用一个 SQL 库(编程库,ANSI SQL 兼容,称为 ABS 数据库,(http://www.componentace.com/help/absdb_manual/absdbmanual_content.htm)。它支持各种连接、CASE、等等……

我有一个表 (appt),它是一个约会表。

ApptKey - Integer - Primary Key
SA_ID -  Integer  (a person’s ID, think employee number),
Layer - Integer – only 4 different values, 1, 2, 3 or 4 (think Appt Category)
Number_Of_Minutes  - Integer – the length of the appointment

请注意,某些 SA_ID/Layer 组合可能为空(即该组合没有行)。其他 SA_ID/Layer 组合可能有多行(我没有显示其他列,因为它们在这里不相关)。我需要一个报告来显示分钟总和,对于每个人 (SA_ID),对于每一层,在一行中......即每个 SA_ID 都有自己的行,显示 Layer =1 的总和, layer =2 的总和,第 3 层的总和,第 4 层的总和。

示例数据…

SA_ID         LAYER        Number_of_Minutes
1             1            10
1             1            30
2             1            10
3             2            10
1             4            10

我需要一个给出这个结果的查询。

SA_ID      LAYER_1     LAYER_2    LAYER_3     LAYER_4
1          40          0          0           10
2          10          0          0           0
3          0           10         0           0

我需要这种格式,因为这个查询提供了一个图表/图形组件……

我认为我需要使用右连接多个相关子查询,但我就是无法让它工作。这是正确的方法吗。我在下面运行的内容,但作为直接连接。我可以(或如何)重写它以使用右外连接吗?右外连接是最好的方法吗?

select g.sa_id,  l1.totalsum, l2.totalsum, l3.totalsum, l4.totalsum
from  (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 1 group by sa_id, layer) l1,
           (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 2 group by sa_id, layer) l2,
           (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 3 group by sa_id, layer) l3,
          (select sa_id, layer, sum(number_of_minutes) totalsum from appt where layer = 4 group by sa_id, layer) l4,
          (select distinct sa_id "sa_id" from appt) g
where
      (l1.sa_id = g.sa_id)
and   (l2.sa_id = g.sa_id)
and   (l3.sa_id = g.sa_id)
and   (l4.sa_id = g.sa_id)

【问题讨论】:

    标签: sql join self outer-join


    【解决方案1】:
    SELECT SA_ID,
    SUM(CASE WHEN LAYER = 1 THEN Number_of_Minutes ELSE 0 END) AS LAYER_1, 
    SUM(CASE WHEN LAYER = 2 THEN Number_of_Minutes ELSE 0 END) AS LAYER_2,
    SUM(CASE WHEN LAYER = 3 THEN Number_of_Minutes ELSE 0 END) AS LAYER_3,
    SUM(CASE WHEN LAYER = 4 THEN Number_of_Minutes ELSE 0 END) AS LAYER_4
    FROM Appt
    GROUP BY SA_ID
    

    编辑:因为它支持CASE 表达式。

    【讨论】:

    • 简单、优雅、实用!比加入要简单得多。谢谢!
    【解决方案2】:
    SELECT
        t.sa_id,
        Layer1=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 1),
        Layer2=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 2),
        Layer3=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 3),
        Layer4=(SELECT SUM(Number_of_Minutes) FROM appt WHERE sa_id = t.sa_id AND Layer = 4)
    
    FROM
    (
        SELECT DISTINCT
            sa_id
        FROM appt
    ) t
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2013-04-16
      • 1970-01-01
      • 2019-07-06
      • 2012-05-22
      • 2012-06-21
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多