Надеюсь, я правильно понял ваш вопрос. Это немного нечетко вместе с SQL, который вы написали.
Я пытался восстановить ваш sql, который никогда не будет работать, как написано, и левое соединение мертв. Я написал sql именно так, как понял ваше описание. Если вы хотите что-то другое, вы должны получить больше информации, такой как testdata и ожидаемый результат.
declare @a table(id int, CustomerNo varchar(20))
declare @b table(bill varchar(20), customerid int, billvalue money)
insert @a values(1, 'abcdefghij09')
insert @b values('a', 1,3.5)
insert @b values('b', 1,42)
insert @b values('c', 1,5)
insert @b values('d', 1,6)
insert @b values('e', 1,2)
;with a as (
select CustomerNo, Bill,billvalue,ROW_NUMBER() OVER (ORDER BY Billvalue ASC) rownumber
from @A p
left join @B m
on p.ID = m.CustomerID
and m.Bill <> ''
where
substring (p.CustomerNo, 11,2) = '09'
), b as
(
select top 2 billvalue, isodd from (select top 50 percent billvalue, rownumber %2 isodd from a order by billvalue) a order by billvalue desc
)
select * from a --- last codeline
Это решит ваш первый вопрос
Чтобы получить медианы для нечетных и четных строк, замените последнюю строку кода на
select * from b
Чтобы сделать медианы частью всего sql, замените последнюю строку кода следующим:
select *, (select billvalue from b where isodd = 0) evenmedianbillvalue,
(select billvalue from b where isodd = 1) oddmedianbillvalue
from a order by billvalue
Результат:
CustomerNo, Bill billvalue rownumber evenmedianbillvalue oddmedianbillvalue
abcdefghij09 e 2 1 3.5 5
abcdefghij09 a 3.5 2 3.5 5
abcdefghij09 c 5 3 3.5 5
abcdefghij09 d 6 4 3.5 5
abcdefghij09 b 42 5 3.5 5