我有两个表,如下所示:
MonthEndDate
2016-06-30 00:00:00.000
2016-07-31 00:00:00.000
2016-08-31 00:00:00.000
2016-09-30 00:00:00.000
2016-10-31 00:00:00.000
2016-11-30 00:00:00.000
2016-12-31 00:00:00.000
并且
MonthEndDate CustomerId Flag
2016-06-30 00:00:00.000 123 1
2016-07-31 00:00:00.000 123 1
2016-08-31 00:00:00.000 123 1
2016-09-30 00:00:00.000 123 1
我想要一个如下所示的输出:
MonthEndDate CustomerId Flag
2016-06-30 00:00:00.000 123 1
2016-07-31 00:00:00.000 123 1
2016-08-31 00:00:00.000 123 1
2016-09-30 00:00:00.000 123 1
2016-10-31 00:00:00.000 123 0
2016-11-30 00:00:00.000 123 0
2016-12-31 00:00:00.000 123 0
表 1 是一个包含月结束日期的 DimDate
表。
表
2 是 CustomerInfo
表。
每当客户在给定月末有值时,该客户的Flag
就会设置为1
。
我想要获得包含每个月结束日期的输出(这就是我起诉 DimDate
表的原因),并且当客户没有月结束值时,我希望标志显示 0 .
我正在使用 SQL Server 2005
这是我使用的一些示例代码:
DECLARE @table1 TABLE
(
MonthEndDate DATETIME
)
INSERT INTO @table1
VALUES('2016-06-30 00:00:00.000')
INSERT INTO @table1
VALUES('2016-07-31 00:00:00.000')
INSERT INTO @table1
VALUES('2016-08-31 00:00:00.000')
INSERT INTO @table1
VALUES('2016-09-30 00:00:00.000')
INSERT INTO @table1
VALUES('2016-10-31 00:00:00.000')
INSERT INTO @table1
VALUES('2016-11-30 00:00:00.000')
INSERT INTO @table1
VALUES('2016-12-31 00:00:00.000')
DECLARE @table2 TABLE
(
MonthEndDate DATETIME
,CustomerId INT
,Flag INT
)
INSERT INTO @table2
VALUES('2016-06-30 00:00:00.000',123,1)
INSERT INTO @table2
VALUES('2016-07-31 00:00:00.000',123,1)
INSERT INTO @table2
VALUES('2016-08-31 00:00:00.000',123,1)
INSERT INTO @table2
VALUES('2016-09-30 00:00:00.000',123,1)
SELECt * FROM @table1
SELECt * FROM @table2
最佳答案
您需要执行CROSS JOIN
才能获取MonthEndDate
和CustomerId
的所有组合。完成后,在 table2
上执行 LEFT JOIN
来获取 Flag
:
SELECT
t1.MonthEndDate,
c.CustomerId,
Flag = ISNULL(t2.Flag, 0)
FROM @table1 t1
CROSS JOIN (SELECT DISTINCT CustomerId FROM @table2) c
LEFT JOIN @table2 t2
ON t1.MonthEndDate = t2.MonthEndDate
AND c.CustomerId = t2.CustomerId
关于SQL - 如何交叉连接两个表以重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45339530/