আপনি এই ডেটাটি রূপান্তর করতে পারেন এমন বেশ কয়েকটি উপায় রয়েছে। আপনার মূল পোস্টে, আপনি বলেছেন যে PIVOTএই দৃশ্যের জন্য খুব জটিল বলে মনে হচ্ছে তবে এটি এসকিউএল সার্ভারে UNPIVOTএবংPIVOT ফাংশন দুটি ব্যবহার করে খুব সহজেই প্রয়োগ করা যেতে পারে ।
তবে, যদি আপনার সেই ফাংশনগুলিতে অ্যাক্সেস না থাকে তবে এটিকে ব্যবহার UNION ALLকরে UNPIVOTএবং তারপরে একটি CASEবিবৃতি সহ একটি সামগ্রিক ফাংশনটি প্রতিরূপ করা যেতে পারে PIVOT:
ছক তৈরি কর:
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
ইউনিয়ন সমস্ত, সমষ্টি এবং CASE সংস্করণ:
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
ডেমো সহ এসকিউএল ফিডল দেখুন
UNION ALLসঞ্চালিত UNPIVOTডেটার কলাম রূপান্তর দ্বারা Paul, John, Tim, Ericপৃথক সারি মধ্যে। তারপরে আপনি প্রতিটিটির জন্য নতুন কলামগুলি পেতে বিবৃতি sum()সহ সামগ্রিক ফাংশনটি প্রয়োগ করুন ।casecolor
আনপিভট এবং পিভট স্ট্যাটিক সংস্করণ:
এসকিউএল সার্ভারে UNPIVOTএবং PIVOTকার্য উভয়ই এই রূপান্তরটি আরও সহজ করে তোলে। আপনি যে মানগুলি রূপান্তর করতে চান তার সবগুলি যদি আপনি জানেন তবে ফলাফলটি পেতে আপনি এটিকে একটি স্ট্যাটিক সংস্করণে হার্ড-কোড করতে পারেন:
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
ডেমো সহ এসকিউএল ফিডল দেখুন
UNPIVOTপারফরম্যান্স সহ অভ্যন্তরীণ ক্যোয়ারী একই ফাংশন সম্পাদন করে UNION ALL। এটি কলামগুলির তালিকা নেয় এবং এটিকে সারিগুলিতে পরিণত করে, PIVOTতারপরে চূড়ান্ত রূপান্তরকে কলামগুলিতে করে।
গতিশীল পিভট সংস্করণ:
আপনার যদি অজানা সংখ্যক কলাম থাকে ( Paul, John, Tim, Ericআপনার উদাহরণে) এবং তারপরে রূপান্তর করতে অজানা সংখ্যক রঙের তালিকা তৈরি করতে আপনি গতিশীল এসকিএল ব্যবহার করতে পারেন UNPIVOTএবং তারপরে PIVOT:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
ডেমো সহ এসকিউএল ফিডল দেখুন
গতিশীল সংস্করণ উভয় জিজ্ঞাস্য yourtableএবং তারপর sys.columnsটেবিলে আইটেমের তালিকা জেনারেট করতে UNPIVOTএবং PIVOT। এটি সম্পাদন করার জন্য একটি কোয়েরি স্ট্রিংয়ে যুক্ত করা হয়। গতিশীল সংস্করণটির প্লাস হ'ল যদি আপনার পরিবর্তিত তালিকা থাকে colorsএবং / অথবা namesএটি রান-টাইমে তালিকা তৈরি করে।
তিনটি প্রশ্নেরই একই ফলাফল হবে:
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |