Это дает результат, который вы просили, и, по крайней мере, устраняет некоторые сложности:
declare @suppliers table (SpID int not null, SupName varchar(10) not null)
insert into @suppliers(SpID,SupName) values
(1,'Test '),
(2,'Test2'),
(3,'Test3')
declare @stock table (SID int not null, ReplaceID int null, SupID int not null,
Qty int not null, PName varchar(10) not null, PSize varchar(10) not null)
insert into @stock(SID,ReplaceID,SupID,Qty,PName,PSize) values
(1 ,11 ,1,2 ,'P1x','5-6'),
(2 ,null,2,5 ,'P2 ','11Y'),
(11,null,1,4 ,'P1 ','6Y '),
(11,null,1,7 ,'P1 ','6Y '),
(12,null,3,10,'P12','1-2')
declare @SupID int
set @SupID = 1
select
COALESCE(st2.SID,st1.SID) as SID,
MAX(CASE WHEN st1.ReplaceID is not null then st1.SID END) as OldID,
sp.SupName,
COALESCE(st2.PName,st1.PName) as PName,
COALESCE(st2.PSize,st1.PSize) as PSize,
SUM(Qty) as Qty
from
@suppliers sp
inner join
@stock st1
on
sp.SpID = st1.SupID
left join
(select SID,SupID,MAX(PName) as PName,MAX(PSize) as PSize from @stock
GROUP By SID,SupID) st2
on
sp.SpID = st2.SupID and
st2.SID = st1.ReplaceID
where
sp.SPID = @SupID
group by
COALESCE(st2.SID,st1.SID),
sp.SupName,
COALESCE(st2.PName,st1.PName),
COALESCE(st2.PSize,st1.PSize)
Результат:
SID OldID SupName PName PSize Qty
----------- ----------- ---------- ---------- ---------- -----------
11 1 Test P1 6Y 13
Как я уже говорил, нам нужно использовать некоторую агрегацию, чтобы получить Qty
. И это основывается на предположении, что PName
и PSize
уникальны для каждого значения SID
(что указывает на плохую нормализацию). Я также предположил, что ReplacementID
поставляется от того же поставщика, что и оригинал.
Альтернативная формулировка, приведенная выше, делает SUM(Qty)
в подзапросе st2
(так как мы все равно уже собираемся там), делает Qty
во внешнем st1.Qty + COALESCE(st2.Qty,0)
, удаляет MAX
вокруг OldID
выражение и может затем устранить внешнее GROUP BY
. Тем не менее, вышеизложенное было моим первым взятием и прочтением «чище» для меня.