1

我有这样的查询

(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 次,当我运行分开的查询时,我得到了很好的结果。

4

2 回答 2

2

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

于 2013-08-07T15:05:33.897 回答
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
于 2013-08-07T15:16:27.787 回答