Sql server 从不同的行中获取相同列名的数据

Sql server 从不同的行中获取相同列名的数据,sql-server,Sql Server,我有三张桌子 CUS_ID CUS_NAME CUS_CNTRY C1 Ajay India C2 Anthony India C3 Scott Australia C4 David UK C5 Lisa India C6 Mark Australia C7 Mary Australia C8 Walter UK 我想找出2012年4月从一家分行转到另一家分行的客户。还显示

我有三张桌子

CUS_ID  CUS_NAME    CUS_CNTRY
    C1  Ajay    India
    C2  Anthony India
    C3  Scott   Australia
    C4  David   UK
    C5  Lisa    India
    C6  Mark    Australia
    C7  Mary    Australia
    C8  Walter  UK
我想找出2012年4月从一家分行转到另一家分行的客户。还显示客户从何处转移到哪个分支机构的分支机构

我尝试使用case语句,但没有成功。现在我有了这个查询

select b.cus_id, b.brch_id, b1.brch_id
from brch_cus b inner join brch_cus b1 on
b.brch_id=b1.brch_id
where 
b.rltshp_start_date=DATEADD(day, 1,b1.rltshp_end_date)
预期结果


像这样的方法应该会奏效:

;with started as (
    select *
    from  brch_cus
    where rltshp_start_date >= '20120401' and rltshp_start_date < '20120501'
),
ended as (
    select * 
    from  brch_cus
    where rltshp_end_date >= '20120401' and rltshp_end_date < '20120501'
)
select c.cus_id, b_from.brch_id as moved_from_branch, b_to.brch_id as moved_to_branch 
from started s 
inner join ended e on s.cus_id = e.cus_id and s.brch_id <> e.brch_id 
and s.rltshp_start_date = dateadd(day, 1, e.rltshp_end_date)
inner join cus c on s.cus_id = c.cus_id
inner join brch b_from on e.brch_id = b_from.brch_id
inner join brch b_to on s.brch_id = b_to.brch_id
我得到了答案

select a.*, b.*
from 
(select cus_id, brch_id as moved_from_branch
from brch_cus
where rltshp_end_date between '2012-04-01' and '2012-04-30')a
inner join
(select cus_id, brch_id as moved_to_branch
from brch_cus
where rltshp_start_date between '2012-04-01' and '2012-04-30')b
on a.cus_id=b.cus_id;

这将导致日期转换错误,因为4月份只有30天…:P
Cus_id     moved_from_branch     moved_to_branch
  C4            B1                   B3
  C8            B2                   B5
;with started as (
    select *
    from  brch_cus
    where rltshp_start_date >= '20120401' and rltshp_start_date < '20120501'
),
ended as (
    select * 
    from  brch_cus
    where rltshp_end_date >= '20120401' and rltshp_end_date < '20120501'
)
select c.cus_id, b_from.brch_id as moved_from_branch, b_to.brch_id as moved_to_branch 
from started s 
inner join ended e on s.cus_id = e.cus_id and s.brch_id <> e.brch_id 
and s.rltshp_start_date = dateadd(day, 1, e.rltshp_end_date)
inner join cus c on s.cus_id = c.cus_id
inner join brch b_from on e.brch_id = b_from.brch_id
inner join brch b_to on s.brch_id = b_to.brch_id
select a.*, b.*
from 
(select cus_id, brch_id as moved_from_branch
from brch_cus
where rltshp_end_date between '2012-04-01' and '2012-04-30')a
inner join
(select cus_id, brch_id as moved_to_branch
from brch_cus
where rltshp_start_date between '2012-04-01' and '2012-04-30')b
on a.cus_id=b.cus_id;