MySQLで年と月でグループ化する方法 質問する

MySQLで年と月でグループ化する方法 質問する

ソース テーブルから ID と ATTRIBUTE の数を測定し、以下の「必要なレポート」に示すようにデータを表示したいと思います。MySQL を使用しています。

ソース:

ID  |  DATE        |  ATTRIBUTE
--------------------------------
1   |  2012-01-14  |   XYZ
2   |  2012-03-14  |   
3   |  2012-03-15  |   XYZ
4   |  2012-04-24  |   ABC
5   |  2012-04-10  |   
6   |  2012-05-11  |   ABC

必要なレポート:

属性の数

   YEAR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC
   ---------------------------------------------------------------------------
   2010 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2011 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2012 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 

IDの数

   YEAR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC
   ---------------------------------------------------------------------------
   2010 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2011 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2012 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 

完了率 (属性数 / ID 数)

   YEAR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC
   ---------------------------------------------------------------------------
   2010 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2011 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 
   2012 |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |  0 

これまでのコードは次のとおりです。ありがとうございます。また、データの日付フィールドから月を抽出する必要があるのですが、方法がわからないことにも注意してください。ありがとうございます。

SELECT YEAR(document_filing_date),MONTH(document_filing_date),COUNT(aif_id)
FROM (a_aif_remaining)
GROUP BY YEAR(document_filing_date),MONTH(document_filing_date);

提案された回答が機能しません!! 理由はわかりませんが、次のようなエラーが表示されます:

"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' COUNT(CASE WHEN MONTH(document_filing_date) = 1 THEN aif_id END) AS Jan, CO' at line 1"

SELECT YEAR(document_filing_date,
  COUNT(CASE WHEN MONTH(document_filing_date) = 1 THEN aif_id END) AS Jan,
  COUNT(CASE WHEN MONTH(document_filing_date) = 2 THEN aif_id END) AS Feb,
  COUNT(CASE WHEN MONTH(document_filing_date) = 3 THEN aif_id END) AS Mar,
  COUNT(CASE WHEN MONTH(document_filing_date) = 4 THEN aif_id END) AS Apr,
  COUNT(CASE WHEN MONTH(document_filing_date) = 5 THEN aif_id END) AS May,
  COUNT(CASE WHEN MONTH(document_filing_date) = 6 THEN aif_id END) AS Jun,
  COUNT(CASE WHEN MONTH(document_filing_date) = 7 THEN aif_id END) AS Jul,
  COUNT(CASE WHEN MONTH(document_filing_date) = 8 THEN aif_id END) AS Aug,
  COUNT(CASE WHEN MONTH(document_filing_date) = 9 THEN aif_id END) AS Sep,
  COUNT(CASE WHEN MONTH(document_filing_date) = 10 THEN aif_id END) AS Oct,
  COUNT(CASE WHEN MONTH(document_filing_date) = 11 THEN aif_id END) AS Nov,
  COUNT(CASE WHEN MONTH(document_filing_date) = 12 THEN aif_id END) AS Dec,
FROM a_aif_remaining
GROUP BY YEAR(document_filing_date);

ベストアンサー1

Attributeこのクエリは、すべての行をカウントし、行内の年と月ごとにグループ化して、null ではない行のみをカウントします。

SELECT
  Year(`date`),
  Month(`date`),
  Count(*) As Total_Rows,
  Count(`Attribute`) As Rows_With_Attribute
FROM your_table
GROUP BY Year(`date`), Month(`date`)

(Count(*) はすべての行をカウントし、Count(Attibute) は属性が null でないすべての行をカウントするためです)

PIVOT でテーブルが必要な場合は、これを使用して、属性が null でない行のみをカウントできます。

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then `Attribute` end) As Jan,
  Count(case when month(`date`)=2 then `Attribute` end) As Feb,
  Count(case when month(`date`)=3 then `Attribute` end) As Mar,
  ...
FROM your_table
GROUP BY Year(`date`)

すべての行をカウントするには次のようにします。

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then id end) As Jan,
  Count(case when month(`date`)=2 then id end) As Feb,
  Count(case when month(`date`)=3 then id end) As Mar,
  ...
FROM your_table
GROUP BY Year(`date`)

(または、ID をカウントする代わりに、 kander の回答のようにSum(Month(日付を使用することもできます)=1))。もちろん、両方のクエリを次のように組み合わせることもできます。

SELECT
  Year(`date`),
  Count(case when month(`date`)=1 then id end) As Jan_Tot,
  Count(case when month(`date`)=1 then `Attribute` end) As Jan_Attr,
  Count(case when month(`date`)=2 then id end) As Feb_Tot,
  Count(case when month(`date`)=2 then `Attribute` end) As Feb_Attr,
  Count(case when month(`date`)=3 then id end) As Mar_Tot,
  Count(case when month(`date`)=3 then `Attribute` end) As Mar_Attr,
  ...
FROM your_table
GROUP BY Year(`date`)

おすすめ記事