sql - 每天从 SQL DB 中选择数据

标签 sql

我在电子商务商店中有一张包含订单信息的表格。架构如下所示:

[订单]
Id|小计|TaxAmount|ShippingAmount|DateCreated

此表仅包含每个订单的数据。因此,如果一天没有任何订单,那么当天就没有销售数据。

我想选择过去 30 天的每日小计,包括没有销售的那些日子。

结果集如下所示:

日期 |销售额
2009-08-01 | 15235
2009-08-02 | 0
2009-08-03 | 340
2009-08-04 | 0
...

这样做,只给我那些有订单的日子的数据:

select DateCreated as Date, sum(ordersubtotal) as SalesSum
from Orders
group by DateCreated

您可以创建一个名为 Dates 的表,然后从该表中进行选择并加入 Orders 表。但我真的很想避免这种情况,因为在处理不同的时区和事物时它不够好......

请不要笑。 SQL 不是我喜欢的东西... :)

最佳答案

创建一个可以生成日期表的函数,如下所示:
(盗自 http://www.codeproject.com/KB/database/GenerateDateTable.aspx)

Create Function dbo.fnDateTable
(
  @StartDate datetime,
  @EndDate datetime,
  @DayPart char(5) -- support 'day','month','year','hour', default 'day'
)
Returns @Result Table
(
  [Date] datetime
)
As
Begin
  Declare @CurrentDate datetime
  Set @CurrentDate=@StartDate
  While @CurrentDate<=@EndDate
  Begin
    Insert Into @Result Values (@CurrentDate)
    Select @CurrentDate=
    Case
    When @DayPart='year' Then DateAdd(yy,1,@CurrentDate)
    When @DayPart='month' Then DateAdd(mm,1,@CurrentDate)
    When @DayPart='hour' Then DateAdd(hh,1,@CurrentDate)
    Else
      DateAdd(dd,1,@CurrentDate)
    End
  End
  Return
End

然后,加入该表
SELECT dates.Date as Date, sum(SubTotal+TaxAmount+ShippingAmount)
FROM [fnDateTable] (dateadd("m",-1,CONVERT(VARCHAR(10),GETDATE(),111)),CONVERT(VARCHAR(10),GETDATE(),111),'day') dates 
LEFT JOIN Orders
ON dates.Date = DateCreated
GROUP BY dates.Date

关于sql - 每天从 SQL DB 中选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274296/

相关文章:

sql - Hive sql : count and avg

android - 如何让 android 微调器从 tblContacts 中选择

sql - super 简单的查询需要 39 秒才能执行

SQL服务器: need to escape [?

sql - 获取特定时间和日期的系统时间 - Oracle SQL

sql - 发布多个项目时 SDL Tridion 超时

mysql sql case语句对于不同的条件给出相同的值

SQL 理解外连接与条件以及为什么条件的顺序可以改变结果

PHP MySQL 发票 Material

SQL 代码错误输入不匹配 'from' 期待