-1

我有一个返回这个派生表的 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、06/2012、11/2012 等)。

我想用 Cat 和 0(零)填写缺少的 MM/YYYYs 分数。我知道开始日期(1/2012)应该是什么。

我试图加入一个表,其中包含将运行查询的范围的所有 MM/YYYY,但这只会返回第一次出现的缺失行,它不会为每个 Cat 重复(应该知道这一点)。

所以我的问题是,我可以使用连接来执行此操作,还是必须在临时表中执行此操作,然后输出数据。我希望返回一个包含 24 行的表格,日期范围为 1/2012 到 12/2012,带有适当的 Cat(Test1 和 Test2)和相应的分数(如果存在)或零(如果不存在)原来的桌子。

AHIGA、LarryR……</p>

4

3 回答 3

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
于 2013-04-26T18:44:06.860 回答
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
于 2013-04-26T18:17:04.957 回答
0

最好的解决方案是创建一个日期表(在一个临时表上)。它占用的空间很小。

于 2013-04-26T16:51:51.690 回答