2014-12-05 90 views
1

我想这两个查询有两个队长相结合应该是平等的:如何合并两个MySQL查询

select distinct(captain_name),sum(finaldiscount) as tot,payment_mode 
from order_master 
where payment_mode='card' 
group by captain_name 

select distinct(captain_name),sum(finaldiscount) as tot,payment_mode 
from order_master 
where payment_mode='cash' 
group by captain_name 
+0

为什么要组合相同的查询?我没有看到查询之间的区别。 – 2014-12-05 10:02:12

+0

这两个查询看起来都是一样的 – 2014-12-05 10:02:30

+0

它被错误地编辑了,在第一个查询中有'payment_mode ='card''。 – 2014-12-05 10:04:02

回答

0

结合可以是JOINUNION

对于JOIN

Select * 
from 
(select distinct(captain_name) capName,sum(finaldiscount) as tot,payment_mode from order_master where payment_mode='card' group by captain_name) t1 
INNER JOIN 
(select distinct(captain_name) capName,sum(finaldiscount) as tot,payment_mode from order_master where payment_mode='cash' group by captain_name) t2 on t1.capName = t2.capName 

对于联合国ION

Select * 
    from 
    (select distinct(captain_name) capName,sum(finaldiscount) as tot,payment_mode from order_master where payment_mode='card' group by captain_name) t1 
    UNION 
    (select distinct(captain_name) capName,sum(finaldiscount) as tot,payment_mode from order_master where payment_mode='cash' group by captain_name) t2 
0

试试这个:

SELECT captain_name, 
     SUM(CASE WHEN payment_mode = 'cash' THEN finaldiscount ELSE 0 END) AS cashTotal, 
     SUM(CASE WHEN payment_mode = 'card' THEN finaldiscount ELSE 0 END) AS cardTotal 
FROM order_master 
WHERE payment_mode IN ('cash', 'card') 
GROUP BY captain_name 

OR

SELECT captain_name, payment_mode, SUM(finaldiscount) total 
FROM order_master 
WHERE payment_mode IN ('cash', 'card') 
GROUP BY captain_name, payment_mode 
0

试试这个:

SELECT captain_name, 
     Sum(finaldiscount) AS tot, 
     payment_mode 
FROM order_master 
WHERE payment_mode IN('cash', 'card') 
     AND captain_name IN (SELECT captain_name 
          FROM order_master 
          WHERE payment_mode IN('cash', 'card') 
          GROUP BY captain_name 
          HAVING Count(DISTINCT payment_mode) = 2) 
GROUP BY captain_name,payment_mode 

子查询将返回唯一的日其中有payment_mode,即cardcash。然后选择captain_namegroup by那些行,按captain_name,payment_mode

,如果你不想单独的行为cardcash然后使用此:

SELECT captain_name,SUM(finaldiscount) 
FROM order_master 
WHERE payment_mode IN('cash', 'card') 
GROUP BY captain_name 
HAVING Count(DISTINCT payment_mode) = 2 

注:我认为two captain should be equal意味着只有那些被两个查询返回的队长,应当由合并返回查询。