我有一个返回此派生表的SQL脚本。
MM/YYYY Cat Score
02/2012 Test1 19
04/2012 Test1 15
05/2012 Test1 16
07/2012 Test1 14
08/2012 Test1 15
09/2012 Test1 15
12/2012 Test1 11
02/2012 Test2 15
03/2012 Test2 13
05/2012 Test2 18
06/2012 Test2 14
08/2012 Test2 15
09/2012 Test2 14
12/2012 Test2 10
如你所见,我错过了一些MM / YYYY(03 / 2012,66 / 2012,11 / 2012等)。
我想用猫与猫填写失踪的MM / YYYY得分为0(零)。我知道开始日期(1/2012)应该是什么。
我试图加入一个包含查询将运行范围的所有MM / YYYY的表,但是这只会返回第一次出现的缺失行,而不会为每个Cat重复(应该知道的是)。
所以我的问题是,我可以使用连接执行此操作,还是必须在临时表中执行此操作,然后输出数据。我希望在1/2012到12/2012的日期范围内返回一个有24行的表,并使用相应的Cat(Test1& Test2)&相应的分数,如果它存在,或者如果它不在原始表中则为零。
AHIGA,LarryR ......
答案 0 :(得分:3)
以下是一个如何使用一些CTE来获取您所追求的内容的示例。这使用三个CTE:一个用于所有日期,一个用于您的类别,然后第三个用于交叉连接它们。第三个实际上是多余的,但它只是让我们看到的更加明显。
DECLARE
@StartDate datetime = '2/1/2012'
,@EndDate datetime = '4/26/2013'
;WITH DATES AS
(
SELECT
CAST(MONTH(@StartDate) as varchar(20)) + '/' + CAST(YEAR(@StartDate) as varchar(20)) 'CurrMonth'
,@StartDate as Datefield
UNION ALL
SELECT
CAST(MONTH(CurrDate) as varchar(20)) + '/' + CAST(YEAR(CurrDate) as varchar(20))
,CurrDate
FROM
DATES
CROSS APPLY (SELECT DATEADD(month, 1, Datefield)) CxA(CurrDate)
WHERE CurrDate < @EndDate
)
,CATS AS
(
SELECT 'Test1' as 'Cat'
UNION ALL
SELECT 'Test2'
)
,AllTheThings AS
(
SELECT
Datefield
,CurrMonth
,Cat
FROM
DATES D
CROSS JOIN
CATS C
)
SELECT * FROM AllTheThings
答案 1 :(得分:2)
如果我没有正确理解,你会像这样加入你的桌子
SELECT
d.Date,c.Cat,ISNULL(t.Score,0) As Score
FROM YourDateTable d
CROSS JOIN
( -- Your Cat Table or UNION Cat here
SELECT 'Test1' AS Cat
UNION ALL
SELECT 'Test2'
) c
LEFT JOIN YourCurrentTable t
ON t.Date = d.Date
AND t.Cat = c.Cat
答案 2 :(得分:0)
最佳解决方案是创建日期表(在临时表上)。这需要很小的空间。