2017-10-12 40 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於2017-10-11

結果:

2017-10-11 8 

任何人都可以幫助我嗎?

附加:結果限制爲最近30天(每查詢)

+0

您的示例數據爲幾天,但預期的結果只包括一天。怎麼來的? – jarlh

回答

2

嘗試date()函數來 「時間戳」 轉換爲 「日期」:

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

在您的WHERE子句中過濾最近30天而不是使用限制。 – combinatorist

0

我已經使用了公用表表達式(CTE)來將日期部分按日,月和年分組,然後將它們呈現爲連貫日期(如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())*/