我有两张约会表,为了问题,他们称之为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
您很可能需要使用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小提琴上,你有2个INSERT
语句进入@Dates1
而没有进入@Dates2
,这也是值得的,因此结果集是所有1
的IsList1
和0
的IsList2
。
;with cte
as
(
select dt.date as tb1,dt1.date as tbl2
from
@dates1 dt
full join
@dates2 dt1
on dt.date =dt1.date
)
select isnull(tb1 ,tbl2 ) as dt,
case when tb1 is not null then 1 else 0 end as list1,
case when tbl2 is not null then 1 else 0 end as list2
from cte
也许是一个简单聚合的另一种选择:
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