联盟两个日期列表,联合进一步信息

时间:2018-03-05 16:22:53

标签: sql-server

我有两个日期表,为了问题,请调用dates1dates2。有时给定日期在两者中,有时它在1但不是2,有时在2但不是1。

我原来的要求只是两个集所有日期的列表

SELECT Date FROM dates1
UNION
SELECT Date FROM dates2

容易腻。新要求;知道日期来自哪个列表(或两者都是如此)。我需要的列如下:

Date, IsList1, IsList2

所以,一些示例数据:

Dates1
======
Date
====
2017-01-31
2017-02-28
2017-03-31

Dates2
======
Date
====
2017-01-31
2017-04-30

预期输出

Date       | IsList1 | IsList2
2017-01-31 | 1       | 1
2017-02-28 | 1       | 0
2017-03-31 | 1       | 0
2017-04-30 | 0       | 1

SQL摆弄上述数据:http://sqlfiddle.com/#!18/9eecb/5425

3 个答案:

答案 0 :(得分:2)

您很可能需要使用FULL OUTER JOIN和一些表达式来实现此目的。

SELECT ISNULL(D1.[Date], D2.[Date]) AS [Date],
       CASE WHEN D1.[Date] IS NULL THEN 0 ELSE 1 END AS IsList1,
       CASE WHEN D2.[Date] IS NULL THEN 0 ELSE 1 END AS IsList2
FROM @dates1 D1
     FULL OUTER JOIN @dates2 D2 ON D1.[Date] = D2.[Date];

对于你的SQL小提琴,你有INSERT@Dates1语句而@Dates2中没有1,因此结果集为IsList1 0的{​​{1}}和IsList2的{​​{1}}。

答案 1 :(得分:1)

{{1}}

答案 2 :(得分:1)

也许是一个简单聚合的另一种选择:

Select Date
      ,InList1=sum(InList1)
      ,InList2=sum(InList2)
 From (
        Select Distinct Date,InList1=1,InList2=0 from @dates1
        Union All
        Select Distinct Date,InList1=0,InList2=1 from @dates2
      ) A
 Group By Date

返回

Date        InList1 InList2
2017-01-31  1       1
2017-02-28  1       0
2017-03-31  1       0
2017-04-30  0       1