加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL组按日,每天显示订单

发布时间:2020-12-12 16:28:24 所属栏目:MsSql教程 来源:网络整理
导读:我有一个SQL 2005表,让我们称之为Orders,格式如下: OrderID,OrderDate,OrderAmount1,25/11/2008,102,23,30/1002008,5 然后我需要生成一份报表,显示过去7天每天的订单量: Day,OrderCount,OrderAmount25/11/2008,2,1226/11/2008,0 27/11/2008,0 28/11/2008,02
我有一个SQL 2005表,让我们称之为Orders,格式如下:
OrderID,OrderDate,OrderAmount
1,25/11/2008,10
2,2
3,30/1002008,5

然后我需要生成一份报表,显示过去7天每天的订单量:

Day,OrderCount,OrderAmount
25/11/2008,2,12
26/11/2008,0 
27/11/2008,0 
28/11/2008,0
29/11/2008,0
30/11/2008,1,5

通常会产生以下SQL查询:

select count(*),sum(OrderAmount)
    from Orders
    where OrderDate>getdate()-7
    group by datepart(day,OrderDate)

有一个问题,它会跳过没有订单的日子:

Day,12
30/11/2008,5

通常情况下,我会使用tally表和外部连接来解决这个问题,但是我真的在寻找一个更简单或更有效的解决方案.对于报告查询来说,似乎已经有一些优雅的解决方案应该可用.

所以:1.这个结果可以从一个简单的查询获得,而不使用统计表?

和2.如果否,我们可以即时创建这个tally表(可靠的)(我可以使用CTE创建一个统计表,但递归堆栈将我限制为100行)?

解决方法

SQL不是“跳过”日期…因为查询运行在实际上在表中的数据.所以,如果你在1月14日的表中没有DATE,那为什么SQL会显示一个结果:)

你需要做的是制作一个临时表,并加入它.

CREATE TABLE #MyDates ( TargetDate DATETIME )
INSERT INTO #MyDates VALUES CONVERT(DATETIME,CONVERT(VARCHAR,GETDATE() - 0,101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME,GETDATE() - 1,GETDATE() - 2,GETDATE() - 3,GETDATE() - 4,GETDATE() - 5,GETDATE() - 6,GETDATE() - 7,101))

SELECT CONVERT(VARCHAR,TargetDate,101) AS Date,COUNT(*) AS OrderCount
FROM dbo.Orders INNER JOIN #MyDates ON Orders.Date = #MyDates.TargetDate
GROUP BY blah blah blah (you know the rest)

你去!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读