SQL - 如何交叉连接两个表以重复值

标签 sql sql-server t-sql join cross-join

我有两个表,如下所示:

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 才能获取MonthEndDateCustomerId 的所有组合。完成后,在 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/

相关文章:

mysql - 如何使用 SQL 使用 WHERE 获取所有行

sql - 如何从 SQLite 中的聚合函数返回关系

mysql - 获取确实引用值列表但同时不引用其他值列表的行

c# - LINQ lambda表达式子查询查找同一表中的父记录

c# - INSERT 语句中的列数多于 VALUES 子句中指定的值?

sql-server - Sql Server 数据库连接字符串中的初始目录是什么意思?

sql-server - SQL Server 2008 R2 : Concatenate alias name with column value

sql - 根据选择的另一行更新行,无需声明变量

sql-server - 导出sql将日期时间转换为yyyy-mm-ddTHH :MM:SS

SQL-计算所有存储过程中特定单词的出现次数