UNPIVOT কলামগুলিকে সারিগুলিতে অনুবাদ করে। প্রক্রিয়াতে এটি নুল মান ( রেফারেন্স ) বাদ দেয় ।
ইনপুট দেওয়া হয়েছে
create table #t
(
ID int primary key,
c1 int null,
c2 int null
);
insert #t(id, c1, c2)
values
(1, 12, 13),
(2, null, 14),
(3, 15, null),
(4, null, null);
UNPIVOT ক্যোয়ারী
select
ID, ColName, ColValue
from
(
select *
from #t
) as p
unpivot
(
ColValue for ColName in
(c1, c2) -- explicit source column names required
) as unpvt;
আউটপুট উত্পাদন করবে
| ID | ColName | ColValue |
|----|---------|----------|
| 1 | c1 | 12 |
| 1 | c2 | 13 |
| 2 | c2 | 14 |
| 3 | c1 | 15 |
দুঃখের বিষয় হচ্ছে সারি 4 সম্পূর্ণভাবে মুছে ফেলা হয়েছে কারণ এতে কেবলমাত্র শূন্যস্থান রয়েছে! উত্স ক্যোয়ারিতে একটি ডামি মান ইনজেকশনের মাধ্যমে এটি সুবিধামত পুনরায় চালু করা যেতে পারে:
select
ID, ColName, ColValue
from
(
select
-5 as dummy, -- injected here, -5 is arbitrary
*
from #t
) as p
unpivot
(
ColValue for ColName in
(dummy, c1, c2) -- referenced here
) as unpvt;
আইডিতে সারিগুলি একত্রিত করে আমরা নন-মানগুলি গণনা করতে পারি। উত্স সারণীতে কলামগুলির মোট সংখ্যার সাথে তুলনা করলে এক বা একাধিক NULL থাকা সারিগুলি সনাক্ত করা যাবে।
select
ID
from
(
select -5 as dummy, *
from #t
) as p
unpivot
(
ColValue for ColName in
(dummy, c1, c2)
) as unpvt
group by ID
having COUNT(*) <> 3;
আমি
ইনজেকশনের ডামি কলামের জন্য
সোর্স টেবিল # টি
+ 1- তে কলামের সংখ্যা হিসাবে 3 গণনা করি
- আইডির জন্য 1, যা UNPIVOTED নয়
ক্যাটালগ টেবিলগুলি পরীক্ষা করে রানটাইম এ এই মানটি পাওয়া যায়।
ফলাফলগুলিতে যোগ দিয়ে মূল সারিগুলি পুনরুদ্ধার করা যেতে পারে।
যদি NULL ব্যতীত অন্য মানগুলি তদন্ত করতে হয় তবে সেগুলি এমন একটি ধারায় অন্তর্ভুক্ত করা যেতে পারে:
...
) as unpvt
where ColValue <> '' -- will eliminate empty strings
আলোচনা
এটির জন্য একটি শনাক্তকারী প্রয়োজন যা UNPIVOT এর মাধ্যমে বহন করে। একটি চাবি সেরা হবে। কারও অস্তিত্ব না থাকলে ROW_NUMBER () উইন্ডো ফাংশন দ্বারা একটি ইনজেকশন দেওয়া যায় , যদিও এটি কার্যকর করা ব্যয়বহুল হতে পারে।
সমস্ত কলামগুলি UNPIVOT ধারাটির মধ্যে স্পষ্টভাবে তালিকাবদ্ধ থাকতে হবে। @ Db2 এর পরামর্শ অনুসারে এসএসএমএস ব্যবহার করে এগুলিকে টেনে আনা যায়। টেবিলে সংজ্ঞাটি যখন অ্যারোন বার্ট্র্যান্ডের পরামর্শ মতো হবে তখন গতিশীল হবে না। এটি প্রায় সকল এসকিউএল-র ক্ষেত্রে।
আমার বরং সীমিত ডেটা সেট করার জন্য এক্সিকিউশন প্ল্যান হ'ল একটি ক্লাস্টারড ইনডেক্স স্ক্যান এবং একটি স্ট্রিম সামগ্রিক। এটি টেবিলের সরাসরি স্ক্যান এবং প্রচুর ওআর ক্লজের চেয়ে মেমরির চেয়ে ব্যয়বহুল।