Sql server 使用联接添加缺少的行
我有一个返回这个派生表的SQL脚本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
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所说内容的示例,请参阅我的答案