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

问题描述 投票:3回答:3

我有两张约会表,为了问题,他们称之为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

sql-server
3个回答
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小提琴上,你有2个INSERT语句进入@Dates1而没有进入@Dates2,这也是值得的,因此结果集是所有1IsList10IsList2


1
投票
;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

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
© www.soinside.com 2019 - 2024. All rights reserved.