Использование оператора Case с разделением by в SQL Server - PullRequest
0 голосов
/ 26 апреля 2018

Привет. Я пытаюсь получить следующее из этого кода. Если найдено более одного совпадения, найдите запись, в которой LearnStartDate = LearnDelFAMDateFrom, оставьте пустым

select 
ukprn, aimseqnumber, LearnRefNumber
,LearnDelFAMCode
,LearnDelFAMType
,LearnDelFAMDateFrom
,LearningStartDate
,CASE
        when rn=1 then LearnDelFAMDateFrom
        when rn <1 then ''
        when (rn =1 and rn > 1) and (LearningStartDate = LearnDelFAMDateFrom) then LearnDelFAMDateFrom
        else
        ''
        end as LearnDelFAMDateFromMOD

--,CASE row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom)  
-- when  1  then LearnDelFAMDateFrom
-- when < 1 then '' 
-- when > 1 and (LearningStartDate = LearnDelFAMDateFrom) then LearnDelFAMDateFrom
-- else ''
--   end as     LearnDelFAMDateFromMOD2

,rn 
--,LearnDelFAMDateTo


from
(select 
     d.ukprn,d.aimseqnumber,d.LearnRefNumber,LearnDelFAMCode,LearnDelFAMType
    ,convert(varchar(10),LearnDelFAMDateFrom) as LearnDelFAMDateFrom
    ,LearnDelFAMDateTo,LearningStartDate
    ,row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom) rn 

    from  d

    left join rp 
    on

        d.ukprn =rp.ukprn
    and d.aimseqnumber=rp.AimSeqNumber
    and d.LearnRefNumber=rp.LearnRefNumber
    and LearnDelFAMCode=rp.ApprenticeshipContractType

    left join   aecld

   on
        d.ukprn =aecld.ukprn
  and   d.aimseqnumber=aecld.AimSeqNumber
  and   d.LearnRefNumber=aecld.learnrefnumber


    where LearnDelFAMType='ACT' 

        ) as ref

Часть кода комментария, которая включает в себя регистр с разделом by, не может быть запущена из-за того, что я не могу использовать знак больше или меньше или равен.

Если я просто использую оператор case для следующего сценария когда (rn = 1 и rn> 1) и (LearningStartDate = LearnDelFAMDateFrom) тогда LearnDelFAMDateFrom Это работает только для записей, когда rn> 1, когда rn = 1, это не работает.

1 Ответ

0 голосов
/ 26 апреля 2018

Я бы порекомендовал использовать таблицу CTE для этой задачи, ROW_NUMBER () ... AS rn будет разрешен, и тогда вы сможете использовать его в своем выражении case

;WITH CTE_TEMP_TABLENAME AS 
(
select 
 d.ukprn,d.aimseqnumber,d.LearnRefNumber,LearnDelFAMCode,LearnDelFAMType
,convert(varchar(10),LearnDelFAMDateFrom) as LearnDelFAMDateFrom
,LearnDelFAMDateTo,LearningStartDate
,row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom) rn 

from  d

left join rp 
on

    d.ukprn =rp.ukprn
and d.aimseqnumber=rp.AimSeqNumber
and d.LearnRefNumber=rp.LearnRefNumber
and LearnDelFAMCode=rp.ApprenticeshipContractType

left join   aecld

on
    d.ukprn =aecld.ukprn
and   d.aimseqnumber=aecld.AimSeqNumber
and   d.LearnRefNumber=aecld.learnrefnumber


where LearnDelFAMType='ACT' 
)

select 
  ukprn
 ,aimseqnumber
 ,LearnRefNumber
 ,LearnDelFAMCode
 ,LearnDelFAMType
 ,LearnDelFAMDateFrom
 ,LearningStartDate
 ,CASE
    when rn=1 then LearnDelFAMDateFrom
    when rn <1 then ''
    when (rn =1 and rn > 1) and (LearningStartDate = LearnDelFAMDateFrom) 
 then LearnDelFAMDateFrom
    else
    ''
    end as LearnDelFAMDateFromMOD
,rn 
,LearnDelFAMDateTo
FROM CTE_TEMP_TABLENAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...