按月分組,沒有數(shù)據(jù)月份的數(shù)據(jù)顯示0

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 50個(gè)常用的sql語句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,254評(píng)論 0 7
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,774評(píng)論 0 33
  • 什么是SQL數(shù)據(jù)庫: SQL是Structured Query Language(結(jié)構(gòu)化查詢語言)的縮寫。SQL是...
    西貝巴巴閱讀 1,856評(píng)論 0 10
  • 在上海工作的日子,讓我覺得有些疲憊。結(jié)束了上一段雇傭關(guān)系,我決定收拾下心情,收起行囊,略微跟風(fēng),像詩人一般的,向...
    陸鴉道人閱讀 481評(píng)論 2 2
  • 家里買的木瓜快要熟透也沒人吃 我只能拿來做甜點(diǎn)了,哈哈哈~ 高顏值低成本~ 配上剛學(xué)會(huì)做的電飯煲蛋糕,覺得世界太美...
    蜜汁玉米閱讀 209評(píng)論 0 0