web-dev-qa-db-ja.com

MySQLで月と年ごとにグループ化する

各行にタイムスタンプのあるテーブルがある場合、この特定のjsonオブジェクト形式に合うようにクエリをどのようにフォーマットしますか。

JSONオブジェクトを年/月に整理しようとしています。

クエリのベースとなるjson:

{
  "2009":["August","July","September"],
  "2010":["January", "February", "October"]
}

ここに私がこれまでに持っているクエリがあります-

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY MONTH(t.summaryDateTime) DESC";

クエリは、(予測して)異なる年をまとめているため、壊れています。

73
Derek Adair
GROUP BY YEAR(t.summaryDateTime), MONTH(t.summaryDateTime) DESC;

あなたが望むものです。

155
Mitch Dempsey
GROUP BY DATE_FORMAT(summaryDateTime,'%Y-%m')
63
Ferhat KOÇER
SELECT MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM trading_summary t
GROUP BY YEAR(t.summaryDateTime) DESC, MONTH(t.summaryDateTime) DESC

YEARとMonthの両方にDESCを使用して正しい順序を取得する必要があります。

8
Sasindu H

私は好む

SELECT
    MONTHNAME(t.summaryDateTime) as month, YEAR(t.summaryDateTime) as year
FROM
    trading_summary t 
GROUP BY EXTRACT(YEAR_MONTH FROM t.summaryDateTime) DESC";
5
John McDonnell

これは古い質問ですが、DBレベルで月の名前が必要ない場合は、次のように動作するはずです。

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month;

EXTRACT関数のドキュメントを参照

おそらく、これはパフォーマンスが優れていることがわかります。アプリケーションレイヤーでJSONオブジェクトを作成している場合は、結果を実行しながらフォーマット/順序付けを行うことができます。

N.B。MySQLのGROUP BY句にDESCを追加できることを知りませんでした。おそらくORDER BY句がありません。

  SELECT EXTRACT(YEAR_MONTH FROM summaryDateTime) summary_year_month 
    FROM trading_summary  
GROUP BY summary_year_month
ORDER BY summary_year_month DESC;
4
Arth

あなたはこのようなことをしなければなりません

SELECT onDay, id, 
sum(pxLow)/count(*),sum(pxLow),count(`*`),
CONCAT(YEAR(onDay),"-",MONTH(onDay)) as sdate 
FROM ... where stockParent_id =16120 group by sdate order by onDay
2
michal

このようなEXTRACT関数を使用します

mysql> SELECT EXTRACT(YEAR FROM '2009-07-02');
       -> 2009
1
rebaimelek

あなたは月のみでグループ化しているので、YEAR()をグループに追加する必要があります

0
Eduardo Rascon

これもできます

SELECT  SUM(amnt) `value`,DATE_FORMAT(dtrg,'%m-%y') AS label FROM rentpay GROUP BY YEAR(dtrg) DESC, MONTH(dtrg) DESC LIMIT 12

年と月で注文します。今年と今月から12か月に戻って注文したいとしましょう

0
Niclausel
SELECT YEAR(t.summaryDateTime) as yr, GROUP_CONCAT(MONTHNAME(t.summaryDateTime)) AS month 
FROM trading_summary t GROUP BY yr

それでも、探している構造を正確に取得するには、外部スクリプトで処理する必要があります。

たとえば、PHPのexplodeを使用して月名のリストから配列を作成し、json_encode()を使用します

0
Mchl