date | plan | temp |
---|---|---|
2013-01-05 | 1 | 0 |
2013-01-06 | 1 | 0 |
2013-01-07 | 0 | 1 |
2013-02-05 | 1 | 0 |
2013-02-06 | 1 | 0 |
2013-03-06 | 0 | 1 |
2013-04-07 | 1 | 0 |
2013-04-08 | 0 | 1 |
2013-05-08 | 1 | 0 |
2013-07-09 | 0 | 1 |
2013-07-10 | 1 | 0 |
想輸出2013年各月份的情況,
語句如下:
SELECT SUBSTRING(date, 6, 2) AS mon, COUNT(paln) AS planed, COUNT(temp) AS temp FROM A WHERE SUBSTRING(date, 1, 4)='2013' GROUP BY SUBSTRING(date, 6, 2)
輸出結(jié)果如下:
Mon | Plan | Temp |
---|---|---|
01 | 2 | 1 |
02 | 2 | 0 |
03 | 0 | 1 |
04 | 1 | 1 |
05 | 1 | 0 |
07 | 1 | 1 |
期待效果:
Mon | Plan | Temp |
---|---|---|
01 | 2 | 1 |
02 | 2 | 0 |
03 | 0 | 1 |
04 | 1 | 1 |
05 | 1 | 0 |
06 | 0 | 0 |
07 | 1 | 1 |
08 | 0 | 0 |
09 | 0 | 0 |
10 | 0 | 0 |
11 | 0 | 0 |
12 | 0 | 0 |
優(yōu)化后的SQL:
SELECT MON,SUM(plAnED) AS planed,SUM(temp) AS tempFROM ( SELECT SUBSTRING(date, 6, 2) AS mon,SUM(paln) AS planed,SUM(temp) AS temp FROM A WHERE SUBSTRING(date, 1, 4)='2013' GROUP BY SUBSTRING(date, 6, 2) UNION SELECT '01' as mon,'0' as PLANED,'0' as temp union SELECT '02' as mon,'0' as PLANED,'0' as temp union SELECT '03' as mon,'0' as PLANED,'0' as temp union SELECT '04' as mon,'0' as PLANED,'0' as temp union SELECT '05' as mon,'0' as PLANED,'0' as temp union SELECT '06' as mon,'0' as PLANED,'0' as temp union SELECT '07' as mon,'0' as PLANED,'0' as temp union SELECT '08' as mon,'0' as PLANED,'0' as temp union SELECT '09' as mon,'0' as PLANED,'0' as temp union SELECT '10' as mon,'0' as PLANED,'0' as temp union SELECT '11' as mon,'0' as PLANED,'0' as temp union SELECT '12' as mon,'0' as PLANED,'0' as temp ) B GROUP BY B.mon ORDER BY B.MON
在原有的基礎(chǔ)之上,虛擬了1到12 月,plan為0, temp 為0 的12 條數(shù)據(jù)出來,因?yàn)槲覀兪褂胹um 函數(shù)的時(shí)候,加上多個(gè)0 也不會(huì)對(duì)統(tǒng)計(jì)結(jié)果產(chǎn)生影響。
查詢結(jié)果加上虛擬的12 條數(shù)據(jù),聯(lián)合在一起成一個(gè)新表 B, 然后再從B 表進(jìn)一步sum 和group by
union 跟group by一起使用
通過兩個(gè)查詢分別加括號(hào)的方式,改成如下:
(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY sroce ASC) UNION (SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC)
這種方式的目的是為了讓兩個(gè)結(jié)果集先分別order by,然后再對(duì)兩個(gè)結(jié)果集進(jìn)行union。但是你會(huì)發(fā)現(xiàn)這種方式雖然不報(bào)錯(cuò)了,但是兩個(gè)order by并沒有效果,所以應(yīng)該改成如下:
SELECT * FROM (SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC) t3 UNION SELECT * FROM (SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC) t4
也就是說,order by不能直接出現(xiàn)在union的子句中,但是可以出現(xiàn)在子句的子句中。
union和union all 的區(qū)別。
union會(huì)過濾掉兩個(gè)結(jié)果集中重復(fù)的行,而union all不會(huì)過濾掉重復(fù)行。
http://www.cnblogs.com/pcheng/p/5939646.html