我有一张这样的桌子:
我想趋势一下我每天得到多少次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年我有5 id_order_state 4和3 id_order_state 17 -10-11。
结果:
2017-10-11 8有人能帮我吗?
额外:将结果限制在最后30天(每次查询)
发布于 2017-10-12 12:31:58
函数的作用是将“时间戳”转换为“日期”:
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发布于 2017-10-12 13:41:04
我使用了一个公共表表达式(CTE)来组合按日、月和年对日期部分进行分组,然后将它们表示为一个连贯的日期(如dd/mm/yyyy)。您可以与Getdate()一起使用它,这样您就可以从今天之前保存数据的任何表中只选择今天的行。我把它放在最后,你可以删除/*和*/,如果你喜欢那样的话。如果您愿意的话,您可以用它创建一个存储过程,然后运行这个过程(EXEC 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())*/https://stackoverflow.com/questions/46709585
复制相似问题