2008-11-30 72 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在線有限公司 加爾各答 *

相關問題