আমি এই সমস্যাটি সমাধানে নেওয়া পদক্ষেপগুলির কিছুটা দীর্ঘ এবং আরও বিশদ ব্যাখ্যা যুক্ত করতে যাচ্ছি। আমি দীর্ঘ ক্ষণ চাইলে ক্ষমা চাই।
আপনার দেওয়া বেসটি দিয়ে শুরু করব এবং কয়েকটি পোস্টের সংজ্ঞা দিতে এটি ব্যবহার করব যা আমি এই পোস্টের বাকী অংশের জন্য ব্যবহার করব। এটি বেস টেবিল হবে :
select * from history;
+--------+----------+-----------+
| hostid | itemname | itemvalue |
+--------+----------+-----------+
| 1 | A | 10 |
| 1 | B | 3 |
| 2 | A | 9 |
| 2 | C | 40 |
+--------+----------+-----------+
এটি আমাদের লক্ষ্য হবে, সুন্দর পিভট টেবিল :
select * from history_itemvalue_pivot;
+--------+------+------+------+
| hostid | A | B | C |
+--------+------+------+------+
| 1 | 10 | 3 | 0 |
| 2 | 9 | 0 | 40 |
+--------+------+------+------+
history.hostid
কলামের মানগুলি পিভট সারণীতে y- মান হয়ে উঠবে । history.itemname
কলামের মানগুলি এক্স-মানগুলিতে পরিণত হবে (স্পষ্ট কারণে)।
যখন আমাকে একটি পাইভট টেবিল তৈরির সমস্যার সমাধান করতে হবে, আমি তিন-পদক্ষেপ প্রক্রিয়া (fourthচ্ছিক চতুর্থ ধাপ সহ) ব্যবহার করে এটি মোকাবিলা করি:
- আগ্রহের কলামগুলি নির্বাচন করুন, যেমন y- মান এবং এক্স-মান
- অতিরিক্ত কলাম সহ বেস টেবিল প্রসারিত করুন - প্রতিটি এক্স-মানের জন্য একটি
- গ্রুপ এবং প্রসারিত টেবিলকে একত্রিত করুন - প্রতিটি y- মানের জন্য একটি গ্রুপ
- (alচ্ছিক) সম্মিলিত টেবিল প্রাকৃত
আসুন আপনার সমস্যায় এই পদক্ষেপগুলি প্রয়োগ করুন এবং দেখুন আমরা কী পাই:
পদক্ষেপ 1: আগ্রহের কলামগুলি নির্বাচন করুন । কাঙ্ক্ষিত ফলাফল সালে hostid
উপলব্ধ Y-মান এবং itemname
উপলব্ধ এক্স-মান ।
পদক্ষেপ 2: অতিরিক্ত কলাম সহ বেস টেবিল প্রসারিত করুন । আমাদের সাধারণত এক্স-ভ্যালুতে একটি কলামের প্রয়োজন। আমাদের এক্স-মান কলামটি মনে করুন itemname
:
create view history_extended as (
select
history.*,
case when itemname = "A" then itemvalue end as A,
case when itemname = "B" then itemvalue end as B,
case when itemname = "C" then itemvalue end as C
from history
);
select * from history_extended;
+--------+----------+-----------+------+------+------+
| hostid | itemname | itemvalue | A | B | C |
+--------+----------+-----------+------+------+------+
| 1 | A | 10 | 10 | NULL | NULL |
| 1 | B | 3 | NULL | 3 | NULL |
| 2 | A | 9 | 9 | NULL | NULL |
| 2 | C | 40 | NULL | NULL | 40 |
+--------+----------+-----------+------+------+------+
নোট করুন যে আমরা সারিগুলির সংখ্যা পরিবর্তন করি নি - আমরা কেবল অতিরিক্ত কলাম যুক্ত করেছি। NULL
এস এর প্যাটার্নটিও লক্ষ করুন - এর সাথে একটি সারিতে itemname = "A"
নতুন কলামের জন্য একটি নন-নাল মান A
এবং অন্যান্য নতুন কলামগুলির নাল মান রয়েছে।
পদক্ষেপ 3: বর্ধিত সারণীটি গোষ্ঠীভুক্ত করুন । আমাদের দরকার group by hostid
, যেহেতু এটি y- মান সরবরাহ করে:
create view history_itemvalue_pivot as (
select
hostid,
sum(A) as A,
sum(B) as B,
sum(C) as C
from history_extended
group by hostid
);
select * from history_itemvalue_pivot;
+--------+------+------+------+
| hostid | A | B | C |
+--------+------+------+------+
| 1 | 10 | 3 | NULL |
| 2 | 9 | NULL | 40 |
+--------+------+------+------+
(দ্রষ্টব্য যে এখন আমাদের প্রতি ওয়াই-ভ্যালুতে একটি সারি রয়েছে)) ঠিক আছে, আমরা প্রায় রয়েছি! আমাদের কেবল সেই কুৎসিতদের হাত থেকে মুক্তি দেওয়া দরকার NULL
।
ধাপ 4: মনোরম । আমরা কেবল শূন্যের সাথে কোনও নাল মান প্রতিস্থাপন করতে যাচ্ছি যাতে ফলাফল সেটটি দেখতে আরও ভাল লাগবে:
create view history_itemvalue_pivot_pretty as (
select
hostid,
coalesce(A, 0) as A,
coalesce(B, 0) as B,
coalesce(C, 0) as C
from history_itemvalue_pivot
);
select * from history_itemvalue_pivot_pretty;
+--------+------+------+------+
| hostid | A | B | C |
+--------+------+------+------+
| 1 | 10 | 3 | 0 |
| 2 | 9 | 0 | 40 |
+--------+------+------+------+
এবং আমরা সম্পন্ন করেছি - আমরা মাইএসকিউএল ব্যবহার করে একটি দুর্দান্ত, সুন্দর পিভট টেবিল তৈরি করেছি।
এই পদ্ধতি প্রয়োগ করার সময় বিবেচনাগুলি:
- অতিরিক্ত কলামগুলিতে কী মান ব্যবহার করতে হবে। আমি
itemvalue
এই উদাহরণে ব্যবহার করেছি
- অতিরিক্ত কলামগুলিতে কী "নিরপেক্ষ" মান ব্যবহার করতে হবে। আমি ব্যবহার করেছি
NULL
, তবে এটি আপনার সঠিক পরিস্থিতির উপর নির্ভর করেও হতে পারে 0
বা হতে পারে""
- গোষ্ঠীকরণের সময় কোন সমষ্টিগত ফাংশনটি ব্যবহার করতে হবে। আমি ব্যবহার করেছি
sum
, তবে count
এবং max
প্রায়শই ব্যবহৃত হয় ( max
প্রায়শই এক সারি "অবজেক্টগুলি" তৈরি করার সময় ব্যবহৃত হয় যা বহু সারি জুড়ে ছড়িয়ে পড়েছিল)
- y- মানগুলির জন্য একাধিক কলাম ব্যবহার করা। এই সমাধানটি y- মানগুলির জন্য একটি একক কলাম ব্যবহার করার মধ্যেই সীমাবদ্ধ নয় - কেবল অতিরিক্ত কলামগুলিকে ক্লজটিতে প্লাগ করুন
group by
(এবং select
তাদেরকে ভুলে যাবেন না )
জ্ঞাত সীমাবদ্ধতা:
- এই সমাধানটি পিভট টেবিলের n কলামগুলিকে অনুমতি দেয় না - বেস টেবিলটি প্রসারিত করার সময় প্রতিটি পিভট কলামটি ম্যানুয়ালি যুক্ত করা দরকার। 5 বা 10 এক্স-মানগুলির জন্য, এই সমাধানটি দুর্দান্ত। 100 এর জন্য, এত সুন্দর নয়। স্বেচ্ছাসেবী পদ্ধতিতে একটি কোয়েরি উত্পন্ন করার কিছু সমাধান রয়েছে তবে সেগুলি কুশ্রী এবং সঠিক হওয়া শক্ত। যখন পাইভট টেবিলটিতে প্রচুর কলাম থাকা দরকার তখন আমি এই সমস্যাটি সমাধান করার ভাল উপায়টি জানি না।