MySQL - 每种类型值

时间:2018-01-31 19:36:29

标签: mysql sql join group-by

我有一个名为门户网站事件的桌子,它在网站上存储一个事件 - 当它发生时,它的类型,或者' l' w' w'或者' a'。

我试图获取过去6个月中每种类型的总数(忽略事件未发生的任何月份),即我最终得到的结果如下: / p>

date_identifier    total_l    total_a    total_w
2017-07            5          4          10
2017-08            8          2          13
...etc

这是我的疑问。问题是它为每行提供了相同的值(总计),而不是该事件类型的特定总值。

SELECT
    DISTINCT SUBSTRING(pe.date, 1, 7) AS date_identifier,
    COUNT(DISTINCT pe_l.id) AS total_l,
    COUNT(DISTINCT pe_w.id) AS total_w,
    COUNT(DISTINCT pe_a.id) AS total_a
FROM 4diboxnnnqt pe
LEFT JOIN 4diboxnnnqt pe_l ON pe_l.user = pe.user && pe_l.type = "l"
LEFT JOIN 4diboxnnnqt pe_a ON pe_a.user = pe.user && pe_a.type = "a"
LEFT JOIN 4diboxnnnqt pe_w ON pe_w.user = pe.user && pe_w.type = "w"
WHERE
    pe.date > DATE_SUB(NOW(), INTERVAL 6 MONTH) &&
    pe.user IN (SELECT user FROM 2oz5a186fle ue JOIN jh4iw0ii196 pc ON ue.user_type IN ("s", "ds") && pc.id = ue.promo && pc.parent_teacher_code = 'nvcdig8isly')
GROUP BY date_identifier

给我,例如:

date_identifier    total_l    total_a    total_w
2017-07            8          2          13
2017-08            8          2          13
2017-09            8          2          13
2017-10            8          2          13
2017-11            8          2          13
2017-12            8          2          13

任何人都可以看到我做错的重复,而不是每月的总数吗?我认为GROUP_BY会钉住这个。

我在查询结构背后的基本原理是从事件表中提取日期以获得任何类型的事件发生时的唯一月份,然后每种类型加入一次,以获得差异化的总计。错误的逻辑?

(P.S。我知道我可以通过子查询来做到这一点,但我认为他们会慢一些......)

2 个答案:

答案 0 :(得分:1)

Arggh。我认为你只需要条件聚合:

SELECT LEFT(pe.date, 7) AS date_identifier,
       SUM(pe.type = 'l') AS total_l,
       SUM(pe.type = 'w') AS total_w,
       SUM(pe.type = 'a') AS total_a
FROM 4diboxnnnqt pe
WHERE pe.date > DATE_SUB(NOW(), INTERVAL 6 MONTH) AND
      pe.user IN (SELECT user
                  FROM 2oz5a186fle ue JOIN
                       jh4iw0ii196 pc
                       ON ue.user_type IN ('s', 'ds') AND
                          pc.id = ue.promo AND
                          pc.parent_teacher_code = 'nvcdig8isly'
                 )
GROUP BY date_identifier;

注意:

  • 布尔值的ANSI标准,为AND,而不是&&
  • 引号字符串的ANSI标准使用单引号,而不是双引号。
  • 如果没有JOIN,我认为COUNT(DISTINCT)是不必要的。

答案 1 :(得分:1)

您可以尝试计算案例或总结案例。

选择
    SUBSTRING(pe.date,1,7)AS date_identifier,
    sum(pe.type =“l”的情况,然后是1,0结束)AS total_l,
    sum(pe.type =“w”的情况,然后是1,0结束)AS total_w,
    sum(pe.type =“a”的情况,然后是1,0结束)AS total_a
来自4diboxnnnqt pe
在哪里 ...
group by date_identifier;