2008-11-30 74 views
14

我有一个SQL 2005表,让我们把它的订单,格式为:SQL组,显示订单每天

OrderID, OrderDate, OrderAmount 
1,  25/11/2008, 10 
2,  25/11/2008, 2 
3,  30/1002008, 5 

然后,我需要产生一个报告表显示在每个订购量一天,在最后7天:

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

SQL查询,通常会产生这样的:

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

具有中存在的问题它会跳过那里有没有订单的日子:

Day,  OrderCount, OrderAmount 
25/11/2008, 2,   12 
30/11/2008, 1,   5 

通常我会这样使用符合表和外固定加入对行那里,但我真的很为这个简单的或更有效的解决方案。对于报表查询来说,这似乎是一种常见的要求,应该已经有一些优雅的解决方案可用。

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

和2.如果否,我们可以创建这个计数表(可靠地)在飞行中(我可以使用CTE创建一个计数表,但递归堆栈限制我为100行)?

+0

你选择例如省略了最新信息。 – 2008-11-30 22:21:18

+5

SQL group by day, 夜间犯罪战斗队 – 2008-12-01 22:20:45

回答

0

根据SQL Server如何处理临时表,您可以或多或少轻松地安排创建一个临时表并使用您感兴趣的7(或那8个?)日期来填充它。然后,您可以使用它作为你的理货表。我所知道的并不是一种更清洁的方式;您只能选择表中存在的数据或者可以从表或一组表中存在的数据中获取的数据。如果在订单表中没有表示日期,则无法从订单表中选择这些日期。

10

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, CONVERT(VARCHAR, GETDATE() - 1, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 2, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 3, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 4, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 5, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 6, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, 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) 

你走了!

0

由于您也希望在其他查询中经常使用此日期表,因此我建议您将其作为一个永久表并创建一项工作,以便每年添加一次新的日期。

1

如果你想看到零值不是把下面的查询:

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

我有同样的问题,这是我如何解决它:

SELECT datename(DW,nDays) TimelineDays, 
    Convert(varchar(10), nDays, 101) TimelineDate, 
    ISNULL(SUM(Counter),0) Totals 
FROM (Select GETDATE() AS nDays 
    union Select GETDATE()-1 
    union Select GETDATE()-2 
    union Select GETDATE()-3 
    union Select GETDATE()-4 
    union Select GETDATE()-5 
    union Select GETDATE()-6) AS tDays 

Left Join (Select * From tHistory Where Account = 1000) AS History 
      on (DATEPART(year,nDays) + DATEPART(MONTH,nDays) + DATEPART(day,nDays)) = 
      (DATEPART(year,RecordDate) + DATEPART(MONTH,RecordDate) + DATEPART(day,RecordDate)) 
GROUP BY nDays 
ORDER BY nDays DESC 

的输出继电器是:

TimelineDays, TimelineDate,  Totals 

Tuesday   10/26/2010  0 
Monday   10/25/2010  6 
Sunday   10/24/2010  3 
Saturday  10/23/2010  2 
Friday   10/22/2010  0 
Thursday  10/21/2010  0 
Wednesday  10/20/2010  0 
0
CREATE PROCEDURE [dbo].[sp_Myforeach_Date] 
    -- Add the parameters for the stored procedure here 
    @SatrtDate as DateTime, 
    @EndDate as dateTime, 
    @DatePart as varchar(2), 
    @OutPutFormat as int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    Declare @DateList Table 
    (Date varchar(50)) 

    WHILE @SatrtDate<= @EndDate 
    BEGIN 
    INSERT @DateList (Date) values(Convert(varchar,@SatrtDate,@OutPutFormat)) 
    IF Upper(@DatePart)='DD' 
    SET @SatrtDate= DateAdd(dd,1,@SatrtDate) 
    IF Upper(@DatePart)='MM' 
    SET @SatrtDate= DateAdd(mm,1,@SatrtDate) 
    IF Upper(@DatePart)='YY' 
    SET @SatrtDate= DateAdd(yy,1,@SatrtDate) 
    END 
    SELECT * FROM @DateList 
END 

把这段代码和拨打SP 以这种方式

exec sp_Myforeach_Date @SatrtDate='03 Jan 2010',@EndDate='03 Mar 2010',@DatePart='dd',@OutPutFormat=106 

感谢 * Suvabrata Roy ICRA在线有限公司 加尔各答 *