2014-12-09 148 views
0

我試過搜索,但我不完全確定如何提前道歉,如果這已在其他地方得到解答。SQL選擇日期範圍內的每個日期的所有內容,每個日期有多個值

我正在嘗試選擇日期範圍(包括那個日期沒有值的地方)的多個值之間的所有內容。我沒有真正解釋過,但下面是我之後輸出的一個例子。

Date Campaign Channel Transaction 
01/01/2015 a Online Sale 
01/01/2015 b Online Sale 
01/01/2015 c Online Sale 
01/01/2015 a Online Cancellation 
01/01/2015 b Online Cancellation 
01/01/2015 c Online Cancellation 
01/01/2015 a Offline Sale 
01/01/2015 b Offline Sale 
01/01/2015 c Offline Sale 
01/01/2015 a Offline Cancellation 
01/01/2015 b Offline Cancellation 
01/01/2015 c Offline Cancellation 
02/01/2015 a Online Sale 
02/01/2015 b Online Sale 
02/01/2015 c Online Sale 
02/01/2015 a Online Cancellation 
02/01/2015 b Online Cancellation 
02/01/2015 c Online Cancellation 
02/01/2015 a Offline Sale 
02/01/2015 b Offline Sale 
02/01/2015 c Offline Sale 
02/01/2015 a Offline Cancellation 
02/01/2015 b Offline Cancellation 
02/01/2015 c Offline Cancellation 

我能夠選擇日期範圍之間,每天卻無法工作,如何選擇每天用即使沒有返回結果每個結果。

編輯 - 添加了解決方案,我發現

OK,所以我有這似乎是爲我工作的解決方案。可能有這樣做的更好的方式和任何建議表示讚賞,但這裏是我現在做

Declare @CC TABLE (Campaign varchar(50)) 
DECLARE @Channel Table (Channel Varchar(255)) 
DECLARE @TYPE TABLE (Transaction_Type varchar(255)) 
Insert Into @CC (Campaign) Values ('1') 
Insert Into @CC (Campaign) Values ('2') 
Insert Into @Channel (Channel) Values ('Online') 
Insert Into @Channel (Channel) Values ('Inbound') 
Insert Into @TYPE (Transaction_Type) Values ('Sale') 
Insert Into @TYPE (Transaction_Type) Values ('Cancellation') 
DECLARE 
@StartDate DATE = Dateadd(YY,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 
@EndDate DATE = Getdate() 
SELECT 
DATEADD(DAY, nbr - 1, @StartDate) as Dates, 
Campaign, 
Channel, 
Transaction_Type 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr 
FROM sys.columns c) nbrs, 
@CC, @Channel, @TYPE WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
Order by Dates asc, Campaign asc, Channel asc, Transaction_Type asc 
+0

我目前已經使用了下面的代碼創建一個靜態表。這將是需要再次使用的東西,所以認爲具有靜態表是有意義的。 'CREATE TABLE _Dates( d DATE, PRIMARY KEY(d) ) DECLARE @dIncr DATE = '2000-01-01' DECLARE @dEnd DATE = '2100年1月1日' WHILE(@dIncr < @dEnd) BEGIN INSERT INTO _Dates(d)VALUES(@dIncr) SELECT @dIncr = DATEADD(DAY,1,@dIncr) END' – 2014-12-09 12:26:07

回答

0

純SQL(並且沒有遞歸的CTE),我怕你會需要a numbers table了點。

的基本思路將是:

  • 確定n,你的開始和結束日期之間的日期數,
  • 選擇數字1〜n從你的號碼錶,
  • 將數字(以天爲單位)添加到開始日期。

這應該會產生一個從開始到結束日期的日期列表,您可以外部加入原始結果集以「填補空白」。

0

我使用的表值函數返回的所有日期範圍(here)..

你可以做小的變化(如重命名,日期時間 - >日期,刪除字符列),以滿足您的需求。

Create Function [dbo].[IntervalaDatumi] 
(
    @DatumsNo DateTime, 
    @DatumsLidz DateTime 
) 
Returns @tab Table 
    (
     Datums DateTime, 
     DatumsChar char(10) 
    ) 
As 
Begin 
    Declare @Dienas int 
    Declare @i int 
    Set @Dienas = DateDiff(Day, @DatumsNo, @DatumsLidz) 

    Set @i = 0; 
    While (@Dienas > @i) 
    Begin 
     Insert Into @tab(Datums, DatumsChar) 
      Values (DateAdd(Day, @i, @DatumsNo), Convert(Char(10), DateAdd(Day, @i, @DatumsNo), 104)) 
     Set @i = @i + 1 
    End 
    return 
End 
1

你可以用CTE來做。

DECLARE 
    @start date = '1900-01-01', 
    @end date = '1900-01-10'; 

with dateRange (myDate) AS (
    select @start myDate 
    UNION ALL 
    select DATEADD(DAY,1,myDate) from dateRange 
    where 
     myDate <= @end 
) 
select 
    * 
from dateRange D 
inner join yourTable T on 
    D.myDate = T.[Date] 
OPTION (MAXRECURSION 365) 

隨着全外連接

DECLARE 
    @start date = '1900-01-01', 
    @end date = '1900-01-10'; 

with dateRange (myDate) AS (
    select @start myDate 
    UNION ALL 
    select DATEADD(DAY,1,myDate) from dateRange 
    where 
     myDate <= @end 
) 
select 
    * 
from dateRange D 
full outer join @CC C ON 
    1=1 
full outer join @Channel CH ON 
    1=1 
full outer join @TYPE Ty ON 
    1=1 
left join yourTable T on 
    D.myDate = T.[Date] and 
    C.Campaign = T.[Campaign] and 
    CH.Channel = T.[Channel] and 
    Ty.[Transaction_Type] = T.[Transaction_Type] 
OPTION (MAXRECURSION 365) 
+0

正忙於此。 +1爲你 – Jaques 2014-12-09 12:09:49

+0

這是我目前用來獲取返回的日期值。我無法確定如何爲每個可能的結果返回日期。例如,我需要爲每個廣告系列,每種可能的交易類型和每個銷售渠道返回1日。我是否需要爲每個結果創建一行並將其連接到我的數據集? – 2014-12-09 12:20:28

+0

將您的廣告系列表全部加入,然後加入您的結果 – mxix 2014-12-09 19:53:04

相關問題