我有一个名为门户网站事件的桌子,它在网站上存储一个事件 - 当它发生时,它的类型,或者' 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。我知道我可以通过子查询来做到这一点,但我认为他们会慢一些......)
答案 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;
注意:
AND
,而不是&&
。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;