【发布时间】:2014-12-09 12:01:21
【问题描述】:
我已经尝试过搜索,但如果这已经在其他地方得到了回答,我不完全确定如何措辞所以提前道歉。
我正在尝试为多个值选择日期范围之间的所有内容(包括该日期没有值的地方)。我还没有真正解释清楚,但下面是我所追求的输出示例。
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
我可以选择日期范围之间的每一天,但是即使没有返回结果,我也无法计算出如何选择每一天的每个结果。
编辑 - 添加了我找到的解决方案
好的,所以我有一个似乎对我有用的解决方案。可能有更好的方法可以做到这一点,任何建议都值得赞赏,但这是我现在正在做的事情
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
【问题讨论】:
-
我目前已经使用下面的代码创建了一个静态表。这将是再次需要的东西,因此认为拥有一个静态表是有意义的。
CREATE TABLE _Dates ( d DATE, PRIMARY KEY (d) ) DECLARE @dIncr DATE = '2000-01-01' DECLARE @dEnd DATE = '2100-01-01' WHILE ( @dIncr < @dEnd ) BEGIN INSERT INTO _Dates (d) VALUES( @dIncr ) SELECT @dIncr = DATEADD(DAY, 1, @dIncr ) END
标签: sql sql-server date