【问题标题】:SQLite Combine Multiple Queries With Shared ColumnSQLite 将多个查询与共享列组合
【发布时间】:2017-09-26 14:00:12
【问题描述】:

我正在尝试编写一个 SQLite 查询来获取一个值的总出现次数,除以月数。

所需输出的示例:

Name   Jun  Jul  Aug  Sept
John   3    2    5    2
Robert 4    12   45   22
Linda  0    2    1    0

我希望Name 字段只返回唯一的结果,所以它基本上每次在六月、七月等月份出现“约翰”时都会计算在内。

这是我到目前为止所拥有的,使用我的实际数据库。它可以返回正确的列和唯一的“ReasonDetail”,但计数不准确:

SELECT * FROM

(
    SELECT ReasonDetail AS Appetite, COUNT(*) AS June
        FROM CallRecords
        WHERE CallReason = 'Appetite Question'
        AND DateTime BETWEEN  '2017-06-01 00:00' AND '2017-07-01 00:00'
        GROUP BY ReasonDetail
),
(
    SELECT COUNT(*) AS July
        FROM CallRecords
        WHERE CallReason = 'Appetite Question'
        AND DateTime BETWEEN  '2017-07-01 00:00' AND '2017-08-01 00:00'
        GROUP BY ReasonDetail
),
(
    SELECT COUNT(*) AS August
        FROM CallRecords
        WHERE CallReason = 'Appetite Question'
        AND DateTime BETWEEN  '2017-08-01 00:00' AND '2017-09-01 00:00'
        GROUP BY ReasonDetail
)
GROUP BY Appetite

我在这里做错了什么?在这种情况下,有没有更好的方法来编译正确的计数?

谢谢!

【问题讨论】:

    标签: sql sqlite select


    【解决方案1】:

    这称为条件聚合。在聚合函数中使用case 表达式。

    SELECT ReasonDetail AS Appetite
    ,COUNT(CASE WHEN DateTime>='2017-06-01 00:00' AND DateTime<'2017-07-01 00:00' THEN 1 END) AS June
    ,COUNT(CASE WHEN DateTime>='2017-07-01 00:00' AND DateTime<'2017-08-01 00:00' THEN 1 END) AS July
    ,COUNT(CASE WHEN DateTime>='2017-08-01 00:00' AND DateTime<'2017-09-01 00:00' THEN 1 END) AS August
    FROM CallRecords
    WHERE CallReason = 'Appetite Question'
    GROUP BY ReasonDetail
    

    【讨论】:

    • 这非常好,而且效果很好。但是,您缺少 DateTime 参数之间的“AND”子句。如果你更新你的答案,我会选择它。
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多