আপনি এই ডেটাটি রূপান্তর করতে পারেন এমন বেশ কয়েকটি উপায় রয়েছে। আপনার মূল পোস্টে, আপনি বলেছেন যে 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()
সহ সামগ্রিক ফাংশনটি প্রয়োগ করুন ।case
color
আনপিভট এবং পিভট স্ট্যাটিক সংস্করণ:
এসকিউএল সার্ভারে 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 |