は月

2017-01-19 5 views
-2

レコードが、私は以下のSQL表には月

テスト

id type receiveDate 
1 Blood 2012-01-18 
2 Blood 2012-01-20 
3 Blood 2012-01-18 
4 Blood 2012-03-01 
5 Blood 2012-05-21 
6 Blood 2012-05-18 
7 Blood 2012-06-14 
8 Blood 2012-07-22 
9 Blood 2012-07-29 
10 Blood 2012-12-04 
11 Blood 2012-12-30 

を持っていない場合そして、私は、私が取得するクエリ

SELECT COUNT(*) 
FROM Tests 
WHERE YEAR(receiveDate) = '2012' 
GROUP BY MONTH(receiveDate) 

を実行した場合はレコードごとに月しかしもゼロをゲット戻る

COUNT(*) 
3 
1 
2 
1 
2 
2 

クエストその月の記録がなくても全12ヶ月を返す方法はありますか?たとえば、出力を取得したいとします。

COUNT(*) 
3 
0 
1 
0 
2 
1 
2 
0 
0 
0 
0 
2 

また、追加ボーナスとしてカウントを表示する方法がありますか? ありがとうございました!

+2

すべての研究を終了しましたか? https://www.google.com/search?q=mysql+get+rows+for+month+for+which+no+data+existsなどのようなものがありますか? – CBroe

+0

追加ボーナス?私はそれが基本的な要件だと思ったでしょう:-( – Strawberry

答えて

2
SELECT Months.m AS month, COUNT(Tests.receiveDate) AS total FROM 
(
    SELECT 1 as m 
    UNION SELECT 2 as m 
    UNION SELECT 3 as m 
    UNION SELECT 4 as m 
    UNION SELECT 5 as m 
    UNION SELECT 6 as m 
    UNION SELECT 7 as m 
    UNION SELECT 8 as m 
    UNION SELECT 9 as m 
    UNION SELECT 10 as m 
    UNION SELECT 11 as m 
    UNION SELECT 12 as m 
) as Months 
LEFT JOIN Tests on Months.m = MONTH(Tests.receiveDate) 
GROUP BY 
    Months.m 

年を特定したい場合は、これを試してください。

SELECT Months.m AS month, COUNT(Tests.receiveDate) AS total FROM 
(
    SELECT 1 as m 
    UNION SELECT 2 as m 
    UNION SELECT 3 as m 
    UNION SELECT 4 as m 
    UNION SELECT 5 as m 
    UNION SELECT 6 as m 
    UNION SELECT 7 as m 
    UNION SELECT 8 as m 
    UNION SELECT 9 as m 
    UNION SELECT 10 as m 
    UNION SELECT 11 as m 
    UNION SELECT 12 as m 
) as Months 
LEFT JOIN Tests on Months.m = MONTH(Tests.receiveDate) 
AND YEAR(Tests.receiveDate) = '2012' 
GROUP BY Months.m 
0

ここでは、1つの行に1年間のすべての結果を表示する代わりの方法があります。

SELECT 
    SUM(if(MONTH(receiveDate) = 1, 1,0)) as Jan, 
    SUM(if(MONTH(receiveDate) = 2, 1,0)) as Feb, 
    SUM(if(MONTH(receiveDate) = 3, 1,0)) as Mar, 
    SUM(if(MONTH(receiveDate) = 4, 1,0)) as Apr, 
    SUM(if(MONTH(receiveDate) = 5, 1,0)) as May, 
    SUM(if(MONTH(receiveDate) = 6, 1,0)) as Jun, 
    SUM(if(MONTH(receiveDate) = 7, 1,0)) as Jul, 
    SUM(if(MONTH(receiveDate) = 8, 1,0)) as Aug, 
    SUM(if(MONTH(receiveDate) = 9, 1,0)) as Sep, 
    SUM(if(MONTH(receiveDate) = 10, 1,0)) as Oct, 
    SUM(if(MONTH(receiveDate) = 11, 1,0)) as Nov, 
    SUM(if(MONTH(receiveDate) = 12, 1,0)) as `Dec` 
FROM test 
WHERE YEAR(receiveDate) = '2012' 
    AND type = 'Blood' 

結果は

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
3 0 1 0 2 1 2 0 0 0 0 2 

であり、あなたが年に複数のタイプを報告したい場合は

SELECT type, 
    SUM(if(MONTH(receiveDate) = 1, 1,0)) as Jan, 
    SUM(if(MONTH(receiveDate) = 2, 1,0)) as Feb, 
    SUM(if(MONTH(receiveDate) = 3, 1,0)) as Mar, 
    SUM(if(MONTH(receiveDate) = 4, 1,0)) as Apr, 
    SUM(if(MONTH(receiveDate) = 5, 1,0)) as May, 
    SUM(if(MONTH(receiveDate) = 6, 1,0)) as Jun, 
    SUM(if(MONTH(receiveDate) = 7, 1,0)) as Jul, 
    SUM(if(MONTH(receiveDate) = 8, 1,0)) as Aug, 
    SUM(if(MONTH(receiveDate) = 9, 1,0)) as Sep, 
    SUM(if(MONTH(receiveDate) = 10, 1,0)) as Oct, 
    SUM(if(MONTH(receiveDate) = 11, 1,0)) as Nov, 
    SUM(if(MONTH(receiveDate) = 12, 1,0)) as `Dec` 
FROM test 
WHERE YEAR(receiveDate) = '2012' 
GROUP by type; 

結果は次のとおりです。

type Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
Blood 3 0 1 0 2 1 2 0 0 0 0 2 
Sweat 2 1 0 0 1 0 0 0 0 0 0 0 
Tears 0 0 1 2 0 0 0 0 0 0 0 0