gre*_*ost 3 mysql sql group-by count
我有3个SELECT语句,我想组合成一个:
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B
ON A.userid = B.userid
WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B
ON A.userid = B.userid
WHERE status = 'C'
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname`
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B ON A.userid = B.userid
WHERE caused_change = 1
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname
Run Code Online (Sandbox Code Playgroud)
但是将它们组合似乎总是会返回一个错误:(操作数应该包含1列)
SELECT
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T1,
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T2,
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T3
Run Code Online (Sandbox Code Playgroud)
所以我尝试从单个语句中删除JOIN和GROUP来制作:
SELECT CONCAT(B.fname, ' ', B.lname) AS fullname,
(SELECT COUNT(A.id) FROM feedbacks A WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T1,
(SELECT COUNT(A.id) FROM feedbacks A WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T2,
(SELECT COUNT(A.id) FROM feedbacks A WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T3
FROM feedbacks
INNER JOIN users B
ON feedbacks.userid = B.userid
GROUP BY fullname
Run Code Online (Sandbox Code Playgroud)
但是,这会返回所有内容的总计与用户的细分(因为计数在where子句中没有说明有关userid或fullname的内容,毫无疑问).
我觉得我很亲密但却缺少一些东西.谁能指出我在这里的正确方向?我只是想了解我做错了什么.
感谢您的时间.
最好的方法是使用条件SUM:
SELECT CONCAT(B.fname, ' ', B.lname) AS fullname,
SUM(
CASE WHEN DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T1,
SUM(
CASE WHEN status = 'C'
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T2,
SUM(
CASE WHEN caused_change = 1
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T3
FROM feedbacks
INNER JOIN users B
ON feedbacks.userid = B.userid
GROUP BY fullname
Run Code Online (Sandbox Code Playgroud)