从不同的行获取数据但是相同的列名称

时间:2014-04-23 09:33:21

标签: sql-server

我有3张桌子

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

 BRCH_ID    BRCH_NAME   BRCH_STATE
    B1      JP NAGAR    KARNATAKA
    B2      JAYANAGAR   KARNATAKA
    B3      DISPUR      ASSAM
    B4      CUTTACK     ORISSA
    B5      CHANDIGARH  PUNJAB

BRCH_ID CUS_ID  RLTSHP_START_DATE   RLTSHP_END_DATE
B1         C1     1/1/2011             23/12/2011
B1         C4     24/12/2011           4/4/2012
B1         C2     21/12/2011           1/1/2012
B2         C7     2/1/2012             4/4/2012
B3         C4     5/4/2012             31/12/2999
B3         C3     5/7/2010             8/8/2011
B4         C5     9/8/2011             9/4/2012
B4         C6     6/4/2012             31/12/2999
B2         C8     7/1/2009             8/4/2012
B5         C1     24/12/20             31/12/2999
B5         C8     9/4/2012             31/12/2999

我想找出在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)

预期结果

Cus_id     moved_from_branch     moved_to_branch
  C4            B1                   B3
  C8            B2                   B5

DEMO FIDDLE

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

;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

答案 1 :(得分:0)

我得到了答案..

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;

fiddle

相关问题