我有两个日期表,为了问题,请调用dates1
和dates2
。有时给定日期在两者中,有时它在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
答案 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