我有一张这样的表:
我希望每天得到多少次id_order_state
4 和 17 。
我试过这样但是它不按我想要的方式工作:
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
但我希望它像:
例如:我在2017-10-11有5个id_order_state 4和3个id_order_state 17
结果:
2017-10-11 8
任何可以帮助我的人?
额外:将结果限制为过去30天(每次查询)
答案 0 :(得分:2)
尝试使用date()函数将“timestamp”转换为“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
答案 1 :(得分:0)
我使用了一个公用表表达式(CTE)来组合日期,月份和年份的日期部分,然后将它们显示为一个连贯的日期(如dd / mm / yyyy)。您可以将此与Getdate()一起使用,以便您可以从任何包含今天之前的数据的表中仅选择TODAY'S行。我已经把它放在最后,你可以删除/ *和* /如果你喜欢这样使用它。如果你愿意,你可以创建一个存储过程,然后运行程序(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())*/