2013-08-07 6 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

이 쿼리는 내 머리를 아프게합니다. 그 유니온을 대체 할 수 있다면 어디에서 (2,3,4,5,6,7) –

답변

2

세 개의 "주요"쿼리 사이에서 두 개의 숫자가 UNION ALL으로 변경되어야한다고 생각합니다. 이렇게하면 중복이 제거되지 않습니다.

+0

감사합니다 :) 당신은 단지 내 하루를 저장 :) – enigmaticus

0

예! 심지어이

(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)) 

나 : 난 당신 같은과 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 != 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