我有一个MySQL表,需要查询两次才能以这种格式生成产品结果:
+------------+----------+-------------------+
| Supplier | Requests | Requests_Approved |
+------------+----------+-------------------+
| Supplier 1 | 50 | 45 |
| Supplier 2 | 75 | 63 |
| Supplier 3 | 48 | 32 |
| Supplier 4 | 104 | 87 |
+------------+----------+-------------------+
到目前为止,我尝试了以下内容:
SELECT Supplier, COUNT(*) AS Requests, COUNT(*) AS Requests_Approved
FROM pricematch
WHERE Date_Received >= '2015-01-01'
AND Date_Received <= '2015-12-31'
AND PM_Level = 'Escalation'
GROUP BY Supplier
UNION
SELECT Supplier, COUNT(*) AS Requests, COUNT(*) AS Approved
FROM pricematch
WHERE Date_Time_Received >= '2015-01-01'
AND Date_Time_Received <= '2015-12-31'
AND PM_Level = 'Escalation'
AND Matched = 'Yes'
GROUP BY Supplier
ORDER BY Requests DESC
LIMIT 20
生成以下结果表,两个数字列的结果相同:
+------------+----------+-------------------+
| Supplier | Requests | Requests_Approved |
+------------+----------+-------------------+
| Supplier 1 | 50 | 50 |
| Supplier 2 | 75 | 75 |
| Supplier 3 | 48 | 48 |
| Supplier 4 | 104 | 104 |
+------------+----------+-------------------+
我在这里已经回顾了许多类似的问题/答案,并尝试使用LEFT JOIN和INNER JOIN进行替换,但查询总是失败。
答案 0 :(得分:3)
使用Conditional Aggregate
SELECT Supplier,
Count(*) AS Requests,
Count(CASE
WHEN Matched = 'Yes' THEN 1
END) AS Approved
FROM pm
WHERE Date_Received >= '2015-01-01'
AND Date_Received <= '2015-12-31'
AND PM_Level = 'Escalation'
GROUP BY Supplier
答案 1 :(得分:2)
我将推测pm
与pricematch
相同,你真的想要条件聚合:
SELECT Supplier, COUNT(*) AS Requests,
SUM(Matched = 'Yes') AS Approved
FROM pricematch pm
WHERE Date_Time_Received >= '2015-01-01' AND
Date_Time_Received <= '2015-12-31' AND
PM_Level = 'Escalation'
GROUP BY Supplier
ORDER BY Requests DESC
LIMIT 20;