2013-08-19 41 views
4

我有以下SQL:如何填寫缺失的月份?

SELECT STRFTIME('%m', date) ord, 
     CASE STRFTIME('%m', date) WHEN '01' THEN 'January' 
            WHEN '02' THEN 'Febuary' 
            WHEN '03' THEN 'March' 
            WHEN '04' THEN 'April' 
            WHEN '05' THEN 'May' 
            WHEN '06' THEN 'June' 
            WHEN '07' THEN 'July' 
            WHEN '08' THEN 'August' 
            WHEN '09' THEN 'September' 
            WHEN '10' THEN 'October' 
            WHEN '11' THEN 'November' 
            WHEN '12' THEN 'December' 
     ELSE '' END AS month, 
     count(*) AS count 
    FROM events 
    WHERE type='Birth' AND 
     date <> '' 
GROUP BY month,ord 
ORDER BY ord 

這使我有類似的結果:

ord month  count 
01 January  1 
02 Febuary  1 
03 March  3 
05 May   4 
07 July   2 
08 August  2 
09 September 2 
11 November  4 

但你可以看到它有差距。有沒有辦法用0計數來填補遺漏的月份?

+2

嘗試使用這個作爲例子:http://stackoverflow.com/a/17916567/342740 – Prix

+0

這是多麼相似問題在TSQL中解決:http://codecorner.galanter.net/2011/08/29/tsql-filling-missing-date-range/不確定SQLite的功能,但我認爲類似的邏輯可以實現。 –

回答

1

學習外部連接。

運行以下一次:

CREATE TABLE months (
    mm char(2), 
    name char(10) 
); 
INSERT INTO months VALUES ('01', 'January'); 
INSERT INTO months VALUES ('02', 'Febuary'); 
INSERT INTO months VALUES ('03', 'March'); 
INSERT INTO months VALUES ('04', 'April'); 
INSERT INTO months VALUES ('05', 'May'); 
INSERT INTO months VALUES ('06', 'June'); 
INSERT INTO months VALUES ('07', 'July'); 
INSERT INTO months VALUES ('08', 'August'); 
INSERT INTO months VALUES ('09', 'September'); 
INSERT INTO months VALUES ('10', 'October'); 
INSERT INTO months VALUES ('11', 'November'); 
INSERT INTO months VALUES ('12', 'December'); 

並運行此:

SELECT m.mm AS ord, 
     m.name AS month, 
     count(e.date) AS count 
    FROM months m LEFT OUTER JOIN events e 
     ON strftime('%m', e.date) = m.mm 
    WHERE e.type='Birth' AND 
     e.date <> '' 
GROUP BY month,ord 
ORDER BY ord;