SQL Server (Transact-SQL)-এ PIVOT ক্লজ ক্রস ট্যাবুলেশন অনুমতি দেয় যাতে একটি টেবিল থেকে ডেটা অন্য টেবিলে স্থানান্তর করা যায়, অর্থাৎ যোগফল ফলাফল পাওয়া যায় এবং সারি থেকে কলামে রূপান্তর করা যায়।

উদাহরণ: যোগফল ক্যালকুলেট করে সারি থেকে কলামে ডেটা টেবিলে ট্রান্সফার
PIVOT ক্লজ সিনট্যাক্স
SELECT cot_dautien AS bidanh_cot_dautien, [giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n] FROM (SELECT ... FROM bang_nguon) AS bidanh_bang_nguon PIVOT ( ham_tong (cot_tong) FOR cot_chuyen IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]) ) AS bidanh_bang_chuyen;
ভেরিয়েবল নাম বা মান
cot_dautien
যে কলাম বা এক্সপ্রেশন ট্রান্সফারের পর নতুন টেবিলে প্রথম কলাম হবে।
bidanh_cot_dautien
ট্রান্সফারের পর নতুন টেবিলে প্রথম কলামের নাম।
giatri_chuyen1, giatri_chuyen2, ... giatri_chuyen_n
ট্রান্সফার করার মান গুলোর তালিকা।
bang_nguon
নতুন টেবিলে সোর্স ডেটা (প্রাথমিক ডেটা) নেওয়ার জন্য SELECT স্টেটমেন্ট।
bidanh_bang_nguon
bang_nguon-এর অ্যালিয়াস।
ham_tong
SUM, COUNT, MIN, MAX বা AVG যেন যোগফল ফাংশন।
cot_tong
ham_tong সাথে ব্যবহৃত কলাম বা এক্সপ্রেশন।
cot_chuyen
যে কলামে ট্রান্সফার করার মান রয়েছে।
bidanh_bang_chuyen
ট্রান্সফারের পর টেবিলের অ্যালিয়াস।
PIVOT ক্লজ SQL Server-এর পরবর্তী ভার্সনগুলিতে ব্যবহার করা যায়: SQL Server 2014, 2012, 2008 R2, 2008, এবং 2005।
টিউটোরিয়ালের ধাপগুলো অনুসরণ করতে, আর্টিকেলের শেষে DDL (টেবিল তৈরির কমান্ড) এবং DML (ডেটা তৈরির কমান্ড) সেকশন দেখুন এবং নিজের ডেটাবেজে চেষ্টা করুন।
PIVOT ক্লজের সাথে উদাহরণ
আমাদের নিচের ডেটা সহ একটি টেবিল আছে।
| so_nhanvien | ho | ten | luong | id_phong |
|---|---|---|---|---|
| 12009 | Nguyen | Huong | 54000 | 45 |
| 34974 | Pham | Hoa | 80000 | 45 |
| 34987 | Phan | Lan | 42000 | 45 |
| 45001 | Tran | Hua | 57500 | 30 |
| 75623 | Vu | Hong | 65000 | 30 |
নিচের SQL কমান্ড চালিয়ে PIVOT ক্লজ দিয়ে ক্রস কোয়েরি তৈরি করুন।
SELECT 'TongLuong' AS TongLuongTheoPhong, [30], [45] FROM (SELECT id_phong, luong FROM nhanvien) AS BangNguon PIVOT ( SUM(luong) FOR id_phong IN ([30], [45]) ) AS BangChuyen;
ফেরত দেওয়া ফলাফল নিচের মতো দেখাবে।
| TongLuongTheoPhong | 30 | 45 |
|---|---|---|
| TongLuong | 122500 | 176000 |
উপরের উদাহরণ ডেটা ট্রান্সফারের পর একটি টেবিল তৈরি করে, যেখানে আইডি ৩০ ও ৪৫ वाले রুমের মোট বেতন দেখানো হয়েছে। ফলাফল এক সারিতে ২ কলামে রয়েছে, প্রতিটি কলাম ১ রুম।
ক্রস কোয়েরির নতুন টেবিলে কলাম নির্দিষ্ট করা
প্রথমে নির্ধারণ করতে হবে ক্রস কোয়েরির টেবিলে কোন ইনফরমেশন ফিল্ড গুলো থাকবে। এই উদাহরণে, TongLuong প্রথম কলাম, তারপর ২টি কলাম id_phong 30 এবং id_phong 45।
SELECT 'TongLuong' AS TongLuongTheoPhong, [30], [45]
সোর্স টেবিলের ডেটা নির্ধারণ করা
পরবর্তী ধাপে নতুন টেবিলের জন্য সোর্স ডেটা রিটার্ন করা SELECT স্টেটমেন্ট।
এই উদাহরণে, এটি id_phong এবং luong nhanvien টেবিল থেকে।
(SELECT id_phong, luong FROM nhanvien) AS BangNguon
সোর্স কোয়েরির জন্য অ্যালিয়াস নির্দিষ্ট করতে হবে, এই উদাহরণে BangNguon।
যোগফল ক্যালকুলেশন ফাংশন নির্ধারণ করা
ক্রস কোয়েরিতে ব্যবহৃত ফাংশন গুলো: SUM, COUNT, MIN, MAX এবং AVG। এই উদাহরণে SUM ফাংশন।
PIVOT (SUM(luong)
ট্রান্সফার করার মান নির্ধারণ করা
শেষে, ফলাফল অন্তর্ভুক্ত করার জন্য যেই মান ট্রান্সফার করতে হবে। এটি ক্রস কোয়েরিতে কলাম হেডার হবে।
এই উদাহরণে, আমরা শুধু id_phong 30 এবং 45 রিটার্ন চাই। এই মান গুলো নতুন টেবিলে কলামের নাম হবে। মনে রাখবেন এই মান গুলো id_phong-এর সীমিত মানের তালিকা এবং সব মান থাকতে বাধ্য নয়।
FOR id_phong IN ([30], [45])
উদাহরণের জন্য DDL / DML
যদি আপনার ডেটাবেজ থাকে এবং উপরের PIVOT ইনস্ট্রাকশন ম্যানুয়ালের উদাহরণগুলো ট্রাই করতে চান, তবে DDL / DML প্রয়োজন।
DDL - Data Definition Language হল PIVOT ক্লজ উদাহরণে ব্যবহারের জন্য টেবিল তৈরির কমান্ড (CREATE TABLE)।
CREATE TABLE phong ( id_phong INT NOT NULL, ten_phong VARCHAR(50) NOT NULL, CONSTRAINT pk_phong PRIMARY KEY (id_phong) ) ;
CREATE TABLE nhanvien ( so_nhanvien INT NOT NULL, ho VARCHAR(50) NOT NULL, ten VARCHAR(50) NOT NULL, luong INT, id_phong INT, CONSTRAINT pk_nhanvien PRIMARY KEY (so_nhanvien) ) ;
DML - Data Manipulation Language হল টেবিলের জন্য প্রয়োজনীয় ডেটা তৈরি করার INSERT স্টেটমেন্ট।
INSERT INTO phong (id_phong, ten_phong) VALUES (30, 'Ketoan');
INSERT INTO phong (id_phong, ten_phong) VALUES (45, 'Banhang');
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (12009, 'Nguyen', 'Huong', 54000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (34974, 'Pham', 'Hoa', 80000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (34987, 'Phan', 'Lan', 42000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (45001, 'Tran', 'Hua', 57500, 30);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (75623, 'Vu', 'Hong', 65000, 30);