2013-08-07 168 views
1

我有这样mysql UNION错误的结果?

(SELECT s1.m as m,IFNULL(s2.y,2013) as y,IFNULL(s2.s,0) as planned FROM 
(SELECT 1 as m 
UNION SELECT 2 
UNION SELECT 3 
UNION SELECT 4 
UNION SELECT 5 
UNION SELECT 6 
UNION SELECT 7 
UNION SELECT 8 
UNION SELECT 9 
UNION SELECT 10 
UNION SELECT 11 
UNION SELECT 12) s1 
LEFT JOIN 
(SELECT YEAR(p.pdate2) as y,MONTH(p.pdate2) as m, SUM(p.totwdisc) as s FROM pro_partial_inv p WHERE YEAR(p.pdate2)=2013 GROUP BY y,m) s2 
ON s1.m=s2.m) 
UNION 
(SELECT s5.m as m,IFNULL(s3.y,2013) as y,IFNULL(s3.s,0) as realv FROM 
(SELECT 1 as m 
UNION SELECT 2 
UNION SELECT 3 
UNION SELECT 4 
UNION SELECT 5 
UNION SELECT 6 
UNION SELECT 7 
UNION SELECT 8 
UNION SELECT 9 
UNION SELECT 10 
UNION SELECT 11 
UNION SELECT 12) s5 
LEFT JOIN 
(SELECT YEAR(p.paidd) as y,MONTH(p.paidd) as m, SUM(p.totwdisc) as s FROM pro_partial_inv p WHERE p.status=2 AND YEAR(p.paidd)=2013 GROUP BY y,m) s3 
ON s5.m=s3.m) 
UNION 
(SELECT s6.m as m,IFNULL(s4.y,2013) as y,IFNULL(s4.s,0) as proj FROM 
(SELECT 1 as m 
UNION SELECT 2 
UNION SELECT 3 
UNION SELECT 4 
UNION SELECT 5 
UNION SELECT 6 
UNION SELECT 7 
UNION SELECT 8 
UNION SELECT 9 
UNION SELECT 10 
UNION SELECT 11 
UNION SELECT 12) s6 
LEFT JOIN 
(SELECT YEAR(p.startd) as y,MONTH(p.startd) as m, SUM(p.disc_n) as s FROM pro_project p WHERE YEAR(p.startd)=2013 GROUP BY y,m) s4 
ON s6.m=s4.m) 

查询所以我需要它是这样的:

m  y  planned 

1 2013 0.00  
2 2013 0.00  
3 2013 0.00  
4 2013 0.00  
5 2013 0.00  
6 2013 908.18  
7 2013 0.00  
8 2013 1136.36  
9 2013 13354.54  
10 2013 0.00  
11 2013 0.00  
12 2013 0.00  
1 2013 0.00  
2 2013 0.00  
3 2013 0.00  
4 2013 0.00  
5 2013 0.00  
6 2013 908.18  
7 2013 0.00  
8 2013 1136.36  
9 2013 13354.54  
10 2013 0.00  
11 2013 0.00  
12 2013 0.00 
1 2013 0.00  
2 2013 0.00  
3 2013 0.00  
4 2013 0.00  
5 2013 0.00  
6 2013 908.18  
7 2013 0.00  
8 2013 1136.36  
9 2013 13354.54  
10 2013 0.00  
11 2013 0.00  
12 2013 0.00 

它像3个工会,看起来非常相似,但是不同。 m代表月份,y年和计算值。我得到的结果是这样的:

m  y  planned 

1 2013 0.00  
2 2013 0.00  
3 2013 0.00  
4 2013 0.00  
5 2013 0.00  
6 2013 908.18  
7 2013 0.00  
8 2013 1136.36  
9 2013 13354.54  
10 2013 0.00  
11 2013 0.00  
12 2013 0.00 
6 2013 0.00 
7 2013 809.09 
8 2013 2227.27 
9 2013 0.00 
7 2013 43600.00 
8 2013 41330.00 

我做错了什么?可能是,但我不知道为什么这里没有联合3次,当我运行查询分开我得到了很好的结果。

+0

此查询会伤害我的大脑。如果有可能用WHERE IN(2,3,4,5,6,7) –

回答

2

我怀疑两个UNION需要更改为UNION ALL三个“主要”查询之间。这可以防止重复被删除。

+0

替代那些UNION的话,我会爱你:)你刚刚救了我的一天:) – enigmaticus

0

是的!我认为你可以像更换各3个内侧区:

(SELECT s2.m as m,IFNULL(s2.y,2013) as y,IFNULL(s2.s,0) as planned FROM 
(SELECT YEAR(p.pdate2) as y,MONTH(p.pdate2) as m, SUM(p.totwdisc) as s FROM pro_partial_inv p WHERE YEAR(p.pdate2)=2013 GROUP BY y,m) s2 
WHERE s2.m in (2,3,4,5,6,7,8,9,10,11,12)) 

,甚至这样的:

(SELECT s2.m as m,IFNULL(s2.y,2013) as y,IFNULL(s2.s,0) as planned FROM 
(SELECT YEAR(p.pdate2) as y,MONTH(p.pdate2) as m, SUM(p.totwdisc) as s FROM pro_partial_inv p WHERE YEAR(p.pdate2)=2013 GROUP BY y,m) s2 
WHERE s2.m != 1) 

其实 - 纠正我,如果我有过于简单而失去的东西 - 但我认为您可以将每个内部部分缩小为:

SELECT 
    YEAR(p.pdate2) as y, 
    MONTH(p.pdate2) as m, 
    SUM(p.totwdisc) as planned 
FROM pro_partial_inv p 
WHERE y=2013 AND m != 1 
GROUP BY y,m