使用连接添加缺少的行

时间:2013-04-26 16:50:04

标签: sql-server sql-server-2008 tsql

我有一个返回此派生表的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 ......

3 个答案:

答案 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)

最佳解决方案是创建日期表(在临时表上)。这需要很小的空间。