【问题标题】:How to include multiple COUNT per day in one query?如何在一个查询中每天包含多个 COUNT?
【发布时间】:2016-05-11 15:12:47
【问题描述】:

尝试获取由过去 8 天的列名“adsource”值确定的 2-3 种条目的计数。到目前为止,我只能抓取一种类型并添加到结果中。数据库 MySql。

我现在得到的结果(只有一种):

days_ago     monthday        type1
---------------------------------
1            2016-05-11      2
2            2016-05-10      34
3            2016-05-09      11
4            2016-05-08      1
5            2016-05-07      0
6            2016-05-06      16
7            2016-05-05      42
8            2016-05-04      76

我追求的结果 -> 2-3 种类型(广告来源列):

monthday        type1        type2
-----------------------------------------
2016-05-11      1            2
2016-05-10      6            0
2016-05-09      6            6
2016-05-08      1            65
2016-05-07      4            23
2016-05-06      1            12
2016-05-05      3            9
2016-05-04      6            11        

我不需要第一列 days_ago,不知道如何将其从显示中删除。我需要能够显示结果:

adsource = 9 as type1
adsource = 12 as type2
adsource = 3 as type3

这是我正在使用的查询:

SELECT *
FROM (
SELECT DATEDIFF(NOW(), edate) AS days_ago, DATE(edate) AS monthday, 
COUNT(DISTINCT entries.email) AS type1
FROM entries
WHERE iplocation = 'mx' AND adsource = 9
GROUP BY DATE(edate)) AS temp
WHERE days_ago <= 8
GROUP BY monthday
ORDER BY monthday DESC

感谢您提供的任何意见:)

【问题讨论】:

    标签: mysql sql join count


    【解决方案1】:

    试试这样的..

    SELECT *
    FROM (
    SELECT DATEDIFF(NOW(), edate) AS days_ago, DATE(edate) AS monthday, 
    COUNT(DISTINCT (case when adsource=9 then entries.email end)) AS type1,
    COUNT(DISTINCT (case when adsource=12 then entries.email end)) AS type2,
    COUNT(DISTINCT (case when adsource=3 then entries.email end)) AS type3
    FROM entries
    WHERE iplocation = 'mx'
    GROUP BY DATE(edate)) AS temp
    WHERE days_ago <= 8
    GROUP BY monthday
    ORDER BY monthday DESC
    

    【讨论】:

    • 这太棒了!!像魅力一样工作,正是我所需要的。非常感谢。我得坐下来继续阅读我的 sql 小册子;)
    【解决方案2】:

    第二列是什么?只需将其添加到查询中:

    SELECT  DATE(edate) AS monthday, COUNT(DISTINCT entries.email) AS type1, COUNT(DISTINCT entries.type2) AS type2
    FROM entries
    WHERE iplocation = 'mx' AND adsource = 9 AND DATEDIFF(DATE(edate), now())     BETWEEN 0 and 7
    GROUP BY DATE(edate)) AS temp
    

    【讨论】:

    • 没有第二列可供选择。计数进入广告资源价值。例如,我的查询将 adsource 9 计为 type1。需要添加更多广告资源。这有意义吗?
    • 而不是将广告源添加到where,然后将其添加到group by,然后您将拥有日期、广告源、计为行,然后您可以单独解析它。有多少种不同的广告来源?
    • 大约有 10 个广告源,但确实需要大约 2-3 个。
    【解决方案3】:

    我不确定您使用的是哪个数据库,但这应该可以在任何数据库中使用。

    SELECT A.monthday, A.type1, B.type2 FROM
      (SELECT DATE(edate) as monthday, COUNT(type1) AS type1
        FROM entries 
        WHERE iplocation = 'mx' AND adsource = 9 AND DATEDIFF(DATE(edate), now()) BETWEEN 0 AND 7
        GROUP BY DATE(edate)) AS A
      (SELECT DATE(edate) as monthday, COUNT(type2) AS type2
        FROM entries
        WHERE iplocation = 'mx' AND adsource = 12 AND DATEDIFF(DATE(edate), now()) BETWEEN 0 AND 7
        GROUP BY DATE(edate)) AS B
    WHERE A.monthday = B.monthday
    

    这将允许您使用多种不同的条件来计数。

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多