Sql server 使用联接添加缺少的行

Sql server 使用联接添加缺少的行,sql-server,sql-server-2008,tsql,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 0

我有一个返回这个派生表的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&a 0 0表分数来填写缺失的MM/YYYY。我知道2012年1月1日的开始日期

我尝试连接一个表,该表包含查询将运行的范围的所有MM/YYYY,但这只返回第一次出现时缺少的行,不会对每个Cat重复该操作

所以我的问题是,我可以使用连接来完成这项工作,还是必须在临时表中完成这项工作,然后输出数据。我希望返回一个包含24行的表,日期范围为2012年1月至2012年12月,如果存在,则返回相应的Cat Test1和Test2以及相应的分数,如果不在原始表中,则返回零


AHIGA,LarryR…

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

如果我理解正确,你会像这样加入你的桌子

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

下面是一个示例,说明如何使用一些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

您是如何将所有日期加入表中的?是否有单独的类别表?是否可以过帐查询中使用的所有表以返回结果?当连接日期表时,只会连接一次缺少的日期,并且Cat为空。如果我连接日期表,缺少的日期只会出现一次,并且Cat col将为空。@larryr您可以根据您想要的内容来填充这些日期。@larryr有关如何执行FreshPrince所说内容的示例,请参阅我的答案