2017-10-12 1 views
1

私はこのようなテーブルがあります。どのように注文状態が毎日であるかを合計しますか?

  • id_order_state
  • DATE_ADD

を私は毎日、私はid_order_state とを取得する回数を基調にしたいです。

私はこのような試みたが、そのは私が望むように動作していない:

SELECT `id_order_state` , `date_add` , COUNT(`id_order_state`) 
FROM `ps_order_history` 
WHERE `id_order_state` IN(4,17) 
AND `date_add` LIKE '2017%' 
GROUP BY `date_add` 
ORDER BY `date_add` ASC 
LIMIT 0 , 30 

は今、私はこのような結果が得られます。

4 2017-10-12 11:51:56  1 
4 2017-10-12 10:42:32  1 
4 2017-10-12 10:41:29  1 
4 2017-10-11 17:06:52  1 
4 2017-10-11 17:06:47  1 
4 2017-10-11 17:06:44  1 
4 2017-10-11 17:06:40  1 
4 2017-10-11 17:06:31  1 
17 2017-10-11 17:06:28  1 
17 2017-10-11 17:06:27  1 
4 2017-10-11 17:06:26  2 
17 2017-10-11 17:06:24  2 
17 2017-10-11 17:06:23  1 
4 2017-10-11 17:06:21  2 

しかし、私はそれのようになりたい:

例:私は5 id_order_state 4と3 id_order_state 17 on 2017-10-11

結果:

2017-10-11 8 

誰でも手伝ってもらえますか?

エクストラ: "日付" に変換するために、最後の30日間(クエリごと)

+0

サンプルデータは数日間ありますが、予想される結果には1日しか含まれていません。どうして? – jarlh

答えて

2

トライ日()関数に結果を制限する "タイムスタンプ":

SELECT 
    date(`date_add`) as date_add, 
    COUNT(*)   as nb, 
FROM 
    `ps_order_history` 
WHERE 
    `id_order_state` IN(4,17) 
AND YEAR(`date_add`) = '2017' 
AND date(`date_add`) >= DATE_SUB(NOW(), INTERVAL 30 DAY) 
GROUP BY 
    date(`date_add`) 
ORDER BY 
    date(`date_add`) ASC 

結果:

date_add  nb 
2017-10-11 11 
2017-10-12 2 
+0

大変ありがとうございました。=) –

+0

結果をDESCに変更する方法はありますか?その代わりに過去30日間ですか? –

+0

limitを使用する代わりに、WHERE句で過去30日間をフィルタリングします。 – combinatorist

0

私は共通部分表式(CTE)を使用して、datepartを日、月、および年ごとにグループ化するだけでなく、dd/mm/yyyyのように一貫性のある日付として提示しました。これをGetdate()と一緒に使うと、今日のデータを保持するテーブルから今日の行だけを選択することができます。私は最後にそれを置いていますが、あなたはそれを使いたいならば、/ *と* /を削除することができます。必要に応じて、ストアドプロシージャを作成し、プロシージャ(EXEC PROC sp_today)を実行するだけで、これを最初に置くことができます。

--CREATE PROC sp_today 
--AS 

WITH CTE (a,b,c,d) 
AS 
(
SELECT 
COUNT(id_order_state), 
CONVERT(VARCHAR,DATEPART(DD,date_add)), 
CONVERT(VARCHAR,DATEPART(MM,date_add)), 
CONVERT(VARCHAR,DATEPART(YYYY,date_add)) 
FROM ps_order_history 
WHERE id_order_state = 4 OR id_order_state = 17 
GROUP BY DATEPART(DD,date_add),DATEPART(MM,date_add),DATEPART(YYYY,date_add) 
) 
SELECT b+'/'+c+'/'+d AS [date],a AS [nmbr] FROM CTE 

/* WHERE b = DATEPART(DD,GETDATE()) AND c = DATEPART(MM,GETDATE()) AND d = 
    DATEPART(YYYY,GETDATE())*/ 
関連する問題