【问题标题】:conditionally sum from one table based on information from another table根据另一个表中的信息有条件地从一个表中求和
【发布时间】:2018-04-04 23:55:23
【问题描述】:

我正在尝试编写一个为 python 脚本输出数据的 sql 查询。 python 脚本最终会将该数据推送到一个表中,以便使事情更顺畅,我决定将输出转换为 char。

我拥有的数据按 15 分钟的周期组织。数据 A 和数据 B 存储在一个表中,并具有列 start_time(作为日期时间)、计数 A 和计数 B。第二个表具有 start_time(作为日期时间)和计数 C。

我需要的是每天 A、B 和 C 的总和。但是,我想有条件地求和,它只计入其他两个数据计数在 15 分钟内不为 NULL 的总和中。例如,如果 15 分钟期间的“行”有 A 和 B 的数据,但没有 C,则它不会计入总和。如何实现这个条件?

示例输出:

date| SUM(A) | SUM(B) | SUM(C)

我可以在没有这样的条件的情况下编写(sql 新手):

SELECT 
    DATE('timezone conversion') AS date,

    cast(SUM(p1.COUNT_DATA_A) as char)
    AS A,

    cast(SUM(p1.COUNT_DATA_B) as char)
    AS B,

    cast(SUM(p2.COUNT_DATA_C) as char)
    AS C
FROM
    table_data_A_B
    AS p1

    LEFT JOIN table_data_C 
    AS p2 ON p1.start_time = p2.start_time

WHERE
    DATE('timezone conversion') >= '2018-03-27'
        AND DATE('timezone conversion') < '2018-03-29'
GROUP BY DATE('timezone conversion')
ORDER BY DATE(p1.start_time) DESC    

我将如何在此查询中实现条件?我很感激帮助。一般来说,我对stackoverflow、编码和sql有点陌生,但我会尽力提供帮助。

【问题讨论】:

  • 您的意思是 p2.COUNT_DATA_C 为空还是 table_data_C 在给定的 15 分钟内没有 start_time?
  • @âńōŋŷXmoůŜ 当 count_data_c 为空时。 start_time 是一个主键,所以我认为它永远不应该为空。
  • 感谢您的回复。 Barmar 已经回答了您的问题,并且是正确的

标签: mysql sql


【解决方案1】:

只需在查询的WHERE 子句中对此进行测试。

WHERE DATE('timezone conversion') BETWEEN '2018-03-27' AND '2018-03-29'
AND p1.COUNT_DATA_A IS NOT NULL AND p1.COUNT_DATA_B IS NOT NULL AND p2.COUNT_DATA_C IS NOT NULL

【讨论】:

  • AND p1.COUNT_DAA_B 上的拼写错误,但我知道您稍后会发现。
  • @âńōŋŷXmoůŜ 这似乎消除了一整天 count_data_A = null 的日期。因此,如果当天没有 15 分钟的数据,则不会显示整行。有没有办法让这些行显示出来,但只报告总和为 NULL?
  • 所以解决方案是添加数据集中缺少的行?我对链接的问题与我的关系有点困惑
  • 不,解决方案是左连接一个包含你想要的所有时间的表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2020-07-28
  • 2022-10-13
  • 2021-03-13
相关资源
最近更新 更多