【问题标题】:2 different queries on same table with count and group by同一张表上的 2 个不同查询,计数和分组依据
【发布时间】:2018-03-26 06:07:52
【问题描述】:

我有一张表entries,其中包含以下列:id、email、sku、payment、created_at

我需要编写一些查询来对条目进行一些分析。我想将两个查询合并为一个:

SELECT sku, count(email) AS total_current FROM entries WHERE payment 不为空且 created_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK) 组 按 sku 按 sku ASC 订购

SELECT sku, count(email) AS total_previous FROM entries WHERE payment IS NOT NULL AND created_at = DATE_SUB(NOW(), INTERVAL 2 WEEK) GROUP BY sku ORDER BY sku ASC

这里的目标是有 3 列的 1 组结果,在第 2 列显示每个 sku 在一个日期范围内的记录数,在第 3 列显示同一 sku 的记录数。

  1. Sku(所有内容都分组)

  2. total_current(每个单独 sku 的第一个查询日期范围内的记录计数)

  3. total_previous(每个单独 sku 的第二个查询日期范围内的记录计数)

并且结果应该按sku升序排序。

我用 UNION 和 JOIN 等尝试了很多不同的东西,但到目前为止都没有运气。

【问题讨论】:

    标签: mysql join sql-order-by union


    【解决方案1】:

    您可以使用条件聚合来组合这两个查询:

    SELECT sku, 
           count(CASE 
                    WHEN created_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK)  THEN email
                 END) AS total_current,
           count(CASE 
                    WHEN  created_at < DATE_SUB(NOW(), INTERVAL 1 WEEK) AND
                         created_at >= DATE_SUB(NOW(), INTERVAL 2 WEEK)  THEN email
                 END) AS total_previous
    FROM entries 
    WHERE payment IS NOT NULL AND 
          created_at >= DATE_SUB(NOW(), INTERVAL 2 WEEK)
    GROUP BY sku 
    ORDER BY sku ASC
    

    【讨论】:

    • 有趣 - 我在所有搜索中都没有看到这样的解决方案,但这是有道理的,而且到目前为止它似乎可以按需要工作。我暂时将其标记为答案。感谢您的快速回复!
    • @Prattski 那就继续吧。
    猜你喜欢
    • 2020-11-29
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2020-04-10
    • 2014-09-05
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多