0

MySQL で次のクエリを使用してレコードを要約しようとしています。毎年少なくとも 1 つのレコードがある限り、うまく機能します。年のレコードが欠落している場合、その年は表示されません。これを変更して、フィルター内で毎年表示するにはどうすればよいですか?

SELECT SUM( SICK_SIZE + DEAD_SIZE ) AS Cases, DATE_FORMAT( EVENT_DATE,  '%Y' ) AS DateYear
FROM report_case_ext
WHERE DATE_FORMAT( EVENT_DATE,  '%Y' ) >= DATE_FORMAT( DATE_ADD( CURDATE( ) , INTERVAL -4YEAR ) ,  '%Y' ) 
AND DATE_FORMAT( EVENT_DATE,  '%Y' ) <= DATE_FORMAT( CURDATE( ) ,  '%Y' ) 
GROUP BY DATE_FORMAT( EVENT_DATE,  '%Y' ) 
4

2 に答える 2

1

MySQLでは、sqlvariablesを使用し、他のテーブルに結合して行の作成をシミュレートできます。これにより、探している年の有効な結果セットが返され、他のテーブルにLEFT-JOINして、常にあなたが望む年...

select
      YearsYouWant.RequireYear as DateYear,
      SUM( RCE.SICK_SIZE + RCE.DEAD_SIZE ) AS Cases
   from
      ( select @nYear := @nYear +1 as RequireYear
           from report_case_ext,
                ( select @nYear := year( curdate()) -5 ) sqlvars
           limit 5 ) as YearsYouWant
         LEFT JOIN
            report_case_ext RCE
               on YearsYouWant.RequireYear = year( RCE.Event_Date )
   GROUP BY 
      YearsYouWant.RequireYear

「report_case_ext」を使用する内部prequeryは、必要な年数を保持するために少なくとも5つのレコードのテーブルを持つためにのみ使用されます...この場合、

@nYearは、探していた4年より1年少ない年に初期化されます-したがって-5

curdate()= 2013-5=2008。

次に、select @nYear:= @nYear +1で、最初の年が2009になり、5年間完了します。これにより、2009、2010、2011、2012、および2013のレコードが生成されます(LIMIT 5経由)

これで、(すべての年の)結果が平年のreport_case_extテーブルに左結合されます。だから、日付がないものでも

于 2013-02-02T02:13:15.237 に答える
0

すべての可能な年/月/日を含むテーブルを作成します (必要に応じて異なります)。次に、テーブルに参加します。

(mysql または perl 側で) SQL の結果に空の日付を埋め込む最も簡単な方法は何ですか?

于 2013-02-02T01:52:40.260 に答える