سلام.
اول اینکه برای هر payment نیاز به دو ستون نیست، بلکه باید مثلا یک ستون داشته باشید به نام 'vam1' و مقدار آن مثلا 1000 یا همان price باشد و برای این کار هم باید از pivot query استفاده کنید.
این کد رو تست کنید و به این صورت عمل کنید:
--بسم الله الرحمن الرحیم
--اللهم صل علی محمد و آل محمد
Create table person (ID int Identity,Name VarChar(10),Family VarChar(20));
insert into person values
('ali','omidvar'),
('reza','hasani');
Create table Payments (PersonID int not null,PaymentName VarChar(10),Price int);
insert into payments values
(1,'vam1',1000),
(1,'vam2',2000)
,(1,'vam3',5000)
,(2,'vam6',5000);
--برای حالت داینامیک خطوط کامنت شده را آنکامنت کنید.
--declare @vamTypes VarChar(max);
--select @vamTypes+=',' + PaymentName from Payments;
--set @VamTypes=stuff(@vamtypes,1,1,'');
--declare @sql VarChar(max);
--set @sql='
select * from
(select p.ID,p.Name,P.family,PY.PaymentName as n,PY.Price as pp
from person P
join Payments PY
on P.ID =PY.PersonID
) source
Pivot
(max(PP) for N in (
--' + @vamTypes + '
vam1,vam2,vam3,vam6--برای حالت داینامیک این خط را کامنت کنید.
)) pivotTable;
--';
-- execute (@sql);
خروجی شبیه به این خواهد بود:
ID/Name/Family/Vam1/Vam2/Vam3/vam6
1/ali/omidi/1000/2000/5000/null
...
برای اینکه ستون ها به صورت داینامیک تغییر کنند و مثلا اگر vam5 هم داشتیم خود به خود به نتیجه اضافه بشه کافیه تا خطوط کامنت شده رو آنکامنت کنید و یک خط از کد رو که مشخص کردم نیز کامنت کنید تا نتیجه به صورت پویا نمایش داده بشه.