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;