2017-01-19 10 views
-1

その月がゼロだったとしても過去12ヶ月に基づいてToxicologyTestsから合計結果を得る次のクエリがあります。過去1年間の結果を過去30日間まで0に制限する

SELECT y, m, Count(ToxicologyTests.receiveDate) as count 
FROM (
    SELECT y, m 
    FROM (
    SELECT YEAR(CURDATE()) y 
    UNION ALL SELECT YEAR(CURDATE())-1) years, 
    (
     SELECT 1 m 
     UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
     UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
     UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 
    ) months 
) ym 
    LEFT JOIN ToxicologyTests 
    ON ym.y = YEAR(ToxicologyTests.receiveDate) 
    AND ym.m = MONTH(ToxicologyTests.receiveDate) 
    WHERE (
     y=YEAR(CURDATE()) 
    AND m<=MONTH(CURDATE()) 
) 
    OR (
     y<YEAR(CURDATE()) 
    AND m>MONTH(CURDATE()) 
) 
GROUP BY y, m 

ゼロがあっても1ヶ月あたりのテスト数が正しく出力されます。私は過去12ヶ月から過去30日間にこれを変えようとしているので、あまりにも多くのことがありました。助言がありますか?

MYSQL

+0

、私はアプリケーションコード – Strawberry

+0

にゼロを処理したい:私は、WHERE句の変更しました'FROM'がありません。クエリが正しいことを確認してください – yaitloutou

答えて

0

このクエリを試すことができますか?最初の `)私は`閉じることに気づいたそれは私だった場合、それを読みやすくするために、SQLクエリをフォーマット中に

SELECT y, m, Count(ToxicologyTests.receiveDate) as count 
FROM (
    SELECT y, m 
    FROM 
    (SELECT YEAR(CURDATE()) y UNION ALL SELECT YEAR(CURDATE())-1) years, 
    (SELECT 1 m UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 
    UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 
    UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months) ym 
    LEFT JOIN ToxicologyTests 
    ON ym.y = YEAR(ToxicologyTests.receiveDate) 
    AND ym.m = MONTH(ToxicologyTests.receiveDate) 
WHERE ToxicologyTests.receiveDate BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW() 
GROUP BY y, m 
関連する問題