2016-03-04 110 views
2

我有一个需要查询两次,产生这种格式产生结果的单一MySQL表:结合2个SQL查询到1,从同一个表

+------------+----------+-------------------+ 
| 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

,什么是混乱呢?你正在使用'COUNT(*)'来计算两者,所以如果值不一样,我会非常惊讶。 –

回答

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 
+0

完美!感谢您及时的回复。将在8分钟内标记为正确答案(如第一次答复):-) – jimbo80

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; 
+0

是的确 - 问题用正确的表名称更新。感谢您及时的回复! :-) – jimbo80