将2个SQL查询从同一个表中合并为1

时间:2016-03-04 13:23:19

标签: mysql sql

我有一个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进行替换,但查询总是失败。

2 个答案:

答案 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)

我将推测pmpricematch相同,你真的想要条件聚合:

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;