如何总结订单状态每天的次数?

问题描述:

我有这样一个表:如何总结订单状态每天的次数?

  • 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

尝试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

我已经使用了公用表表达式(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())*/