【问题标题】:SQL: sum of a value but for distinct ids only - conditional sum?SQL:一个值的总和,但仅适用于不同的 id - 条件总和?
【发布时间】:2012-10-06 13:55:34
【问题描述】:

我有以下结构:

具有 typ1 和 typ2 多个事件的日期,其中 typ1 和 typ2 具有各自日期的外键。 Typ2 也有持续时间。

现在我想统计所有 typ1 事件、所有 typ2 事件以及 typ2 持续时间的总和。

示例数据:

日期:

ID = 1 | Date = yesterday | ...

类型 1:

ID = 1 | FK_DAY = 1 | ...

ID = 2 | FK_DAY = 1 | ...

类型2:

ID = 1 | FK_DAY = 1 | duration = 10

ID = 2 | FK_DAY = 1 | duration = 20

我现在想要结果:

Day.ID = 1 | countTyp1 = 2 | countTyp2 = 2 | sumDurationTyp2 = 30

我的问题是总和,我需要类似“sum for distinct typ2.ID”之类的东西......有谁知道解决这个问题的方法吗?

我正在使用类似以下的东西,但这当然不能按我想要的方式工作:

SELECT day.id,
   count( DISTINCT typ1.id ),
   count( DISTINCT typ2.id ),
   sum( duration ) AS duration
FROM days
   LEFT JOIN typ
          ON day.id = typ1.id
   LEFT JOIN typ2
          ON day.id = typ2.id
GROUP BY day.id;

【问题讨论】:

    标签: sql sum conditional


    【解决方案1】:

    我对此的一般方法是在加入之前预先聚合每个表。

    部分是因为您实际上并没有对不同的值求和(如果两行中的每一行都有10,答案仍然是20)。

    但主要是因为它实际上更简单。子查询进行聚合,然后连接都是 1:1。

    SELECT
      days.id,
      typ_agg.rows,
      type2_agg.rows,
      type2_agg.duration
    FROM
      days
    LEFT JOIN
      (SELECT fk_day, COUNT(*) as rows FROM typ GROUP BY fk_day)  AS typ_agg
        ON days.id = typ_agg.fk_day
    LEFT JOIN
      (SELECT fk_day, COUNT(*) as rows, SUM(duration) as duration FROM typ2 GROUP BY fk_day)  AS typ2_agg
        ON days.id = typ2_agg.fk_day
    

    【讨论】:

    • 。 .我希望这是公认的答案,因为这是正确的方法。
    • 非常感谢,在我更复杂的实际查询中,这确实使它更具可读性
    • 谢谢,我还没有在 join 语句中完成 select 语句。这救了我。
    【解决方案2】:
    SELECT day.id,
       count( DISTINCT typ1.id ),
       count( DISTINCT typ2.id ),
       (select sum( t2.duration )
        from typ2 t2
        where t2.id = day.id
       ) AS duration
    FROM days
       LEFT JOIN typ
              ON day.id = typ1.id
       LEFT JOIN typ2
              ON day.id = typ2.id
    GROUP BY day.id;
    

    【讨论】:

    • 这引入了额外的子查询,我相信 OP 正在寻找一个单一的查询解决方案。您的回答是否意味着它不能写为单个查询?
    • @Yuck - 它在哪里说 single queryno sub-queries。为什么你认为sub-queries 不是single query 的一部分? (如果他们是某个东西的sub-,那么他们就是其中的一部分,而it 是一个单一的查询......) 更不用说某些 RDBMS 在扩展 sub 方面非常出色- 查询出来。
    • FWIW 这不是我的反对意见。至少在 SQL Server 中,这种类型的查询(通常)具有严重的性能损失。并不是说它是错的。我只是在问这个问题 - 有没有办法在不选择所涉及的表的情况下做到这一点?
    • 我正在使用 SQLite,而这个答案正是我想要的……如果有更快的方法,我仍然对它感兴趣……
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多