Rya*_*yan 5 mysql subquery having
我正在查询今年有多少活动人士多次参加团队志愿服务;我让它作为一个独立的查询工作:
SELECT Activists.team, COUNT(id) AS Activists
FROM
(
SELECT e.id, v.team,
COUNT(CASE WHEN (e.status="Completed" AND right(e.date,2)="15") THEN e.id END) AS count
FROM actiontable e
LEFT JOIN persontable v ON v.id = e.id
GROUP BY e.id, v.team
HAVING (count > 1)
) AS Activists
GROUP BY Activists.team;
Run Code Online (Sandbox Code Playgroud)
但我不太清楚如何让它在更长的SELECT声明中发挥作用。我遇到的问题是,我还有许多其他(更简单)的查询部分,可以在语句中按团队返回内容,例如SELECT:
COUNT(DISTINCT CASE WHEN v.WillCanvass = "X" THEN v.id END)
Run Code Online (Sandbox Code Playgroud)
显然,我不能获得HAVING (count > 1)活动人士的查询部分,因为那样它会影响我SELECT声明的所有其他部分——所以我需要上面的子查询只影响我正在处理的唯一部分。
我用示例模式制作了一个SQL Fiddle来帮助完成上述有效的查询 - 但理想的情况是获得与此类似的输出,其中子查询Activists不会影响WillCanvass列(即使我编造了数字)以下):
Team Activists WillCanvass
Team A 2 2
Team B 8 5
Team C 7 3
Run Code Online (Sandbox Code Playgroud)
希望这是有道理的——谢谢!
编辑
我对我想要的最好的尝试——尽管查询给了我错误——看起来像这样:
SELECT a.team as team,
COUNT(v.*) as activists,
SUM(CASE WHEN v.WillCanvass = "X" THEN 1 ELSE 0 END) as WillCanvass
FROM
persontable v
left join
(
SELECT e.id,
v.team,
v.WillCanvass,
COUNT(*) as count
FROM actiontable e
LEFT JOIN persontable v ON v.id = e.id
WHERE e.status="Completed" AND right(e.date,2)="15"
GROUP BY e.id
HAVING (count > 1)) as a
GROUP BY team;
Run Code Online (Sandbox Code Playgroud)
这里有一个更新的 SQL Fiddle 。
我明白了——谢谢你帮助我到达那里,但这与上面的任何东西都非常不同。我必须HAVING完全删除该子句,以使SELECT语句的第一部分 ( WillCanvass) 完全独立于actiontable它的一部分:
SELECT a.team as team,
COUNT(case when a.X > 1 then a.id else null end) as activists,
SUM(CASE WHEN a.WillCanvass = "X" THEN 1 ELSE 0 END) as WillCanvass
FROM (
SELECT v.id,
v.team,
v.WillCanvass,
COUNT(case when e.status="Completed" AND right(e.date,2)="15" then e.id else null end) as X
FROM actiontable e
RIGHT JOIN persontable v ON v.id = e.id
GROUP BY v.id, v.team, v.WillCanvass
) as a
GROUP BY team;
Run Code Online (Sandbox Code Playgroud)
这里有一个新的SQL Fiddle来看看它是如何工作的。