2013-08-07 5 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 представляет месяц, год и запланированные значения из расчета. В результате я получаю следующее:

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

этот вопрос причиняет боль моему мозгу. Я бы с удовольствием, если бы можно было заменить эти UNION на WHERE IN (2,3,4,5,6,7) –

ответ

2

Я подозреваю, что два UNION s необходимо изменить на UNION ALL между тремя «крупными» запросами. Это предотвращает удаление дубликатов.

+0

спасибо :) ты только что сэкономил мой день :) – 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 
Смежные вопросы