Guruhlash to'plamlari
Kirish: ushbu qo'llanmada siz bitta so'rov doirasida bir nechta guruhlashlarni yaratish uchun PostgreSQL GROUPING SETS dan qanday foydalanishni o'rganasiz.
PostgreSQLda GROUPING SETS — bu bitta so'rov doirasida bir nechta guruhlashlarni yaratish imkonini beruvchi GROUP BY bandining kengaytirilgan imkoniyatidir.
GROUP BY bandi bitta guruhlash yaratish imkonini beradi. Bir nechta guruhlashlarni yaratish uchun siz GROUP BY bandlaridan foydalangan holda bir nechta so'rovlar yozishingiz mumkin.
Muqobil ravishda, GROUP BY bandlariga ega bir nechta so'rovlarni UNION operatorlari yordamida birlashtirishingiz mumkin.
GROUPING SETS bir nechta so'rovlardan yoki UNION operatoridan foydalanmasdan, aynan bir so'rovning o'zida bir nechta guruhlashlarni amalga oshirishga imkon beradi.
Quyida GROUPING SETS ning umumiy sintaksisi keltirilgan:
SELECT
column1,
column2,
aggregate_function (column3)
FROM
table_name
GROUP BY
GROUPING SETS (
(column1, column2),
(column1),
(column2),
()
);
Ushbu sintaksisda:
GROUP BY bandi ichida GROUPING SETS dan foydalaning.GROUPING SETS ichida guruhlash to'plamlari ro'yxatini belgilang.So'rov to'rtta guruhlash to'plamini hosil qiladi:
(column1, column2) qatorlarni column1 va column2 bo'yicha guruhlaydigan guruhlashni belgilaydi.(column1) qatorlarni column1 bo'yicha guruhlaydigan guruhlashni belgilaydi.(column2) qatorlarni column2 bo'yicha guruhlaydigan guruhlashni belgilaydi.() jami qatorlar bo'yicha agregatsiyani (umumiy yakunni) ifodalovchi bo'sh to'plamni belgilaydi.E'tibor bering, sizda ko'proq yoki kamroq guruhlash to'plamlari bo'lishi mumkin. Masalan, quyidagi so'rov uchta guruhlash to'plamini qaytaradi:
SELECT
column1,
column2,
aggregate_function (column3)
FROM
table_name
GROUP BY
GROUPING SETS (
(column1),
(column2),
()
);
GROUPING SETS qanday ishlashini tasvirlash uchun quyidagi inventory_reports jadvalidan foydalanamiz.
Quyida inventory_reports jadvalini yaratish skripti keltirilgan:
CREATE TABLE inventory_reports(
warehouse VARCHAR NOT NULL,
brand VARCHAR NOT NULL,
quantity INT NOT NULL
);
INSERT INTO inventory_reports(warehouse, brand, quantity)
VALUES
('San Jose', 'Apple', 100),
('San Francisco', 'Apple', 200),
('Texas', 'Apple', 300),
('San Jose', 'Samsung', 50),
('San Francisco', 'Samsung', 100),
('Texas', 'Samsung', 150)
RETURNING *;
Natija:
warehouse | brand | quantity
---------------+---------+----------
San Jose | Apple | 100
San Francisco | Apple | 200
Texas | Apple | 300
San Jose | Samsung | 50
San Francisco | Samsung | 100
Texas | Samsung | 150
Quyidagi so'rov bir nechta guruhlashlarni qaytarish uchun GROUPING SETS dan foydalanadi:
SELECT
warehouse,
brand,
SUM(quantity) total
FROM
inventory_reports
GROUP BY
GROUPING SETS ((warehouse, brand), (warehouse), (brand), ())
ORDER BY
warehouse NULLS LAST,
brand NULLS LAST;
Natija:
warehouse | brand | total
---------------+---------+-------
San Francisco | Apple | 200
San Francisco | Samsung | 100
San Francisco | NULL | 300
San Jose | Apple | 100
San Jose | Samsung | 50
San Jose | NULL | 150
Texas | Apple | 300
Texas | Samsung | 150
Texas | NULL | 450
NULL | Apple | 600
NULL | Samsung | 300
NULL | NULL | 900
Ushbu misolda GROUPING SETS to'rtta guruhlashni hosil qiladi:
(warehouse, brand) guruhlash ombor va brend bo'yicha inventarni guruhlaydi:
warehouse | brand | total
---------------+---------+-------
San Francisco | Apple | 200
San Francisco | Samsung | 100
San Jose | Apple | 100
San Jose | Samsung | 50
Texas | Apple | 300
Texas | Samsung | 150
(warehouse) guruhlash inventarni faqat ombor bo'yicha guruhlaydi:
warehouse | brand | total
---------------+---------+-------
San Francisco | NULL | 300
San Jose | NULL | 150
Texas | NULL | 450
(brand) guruhlash inventarni faqat brend bo'yicha guruhlaydi:
warehouse | brand | total
---------------+---------+-------
NULL | Apple | 600
NULL | Samsung | 300
() guruhlash barcha omborlar va barcha brendlarning umumiy inventarini ifodalaydi:
warehouse | brand | total
---------------+---------+-------
NULL | NULL | 900
Quyidagi misol ikkita guruhlash yaratish uchun GROUPING SETS dan foydalanadi:
SELECT
warehouse,
brand,
SUM(quantity)
FROM
inventory_reports
GROUP BY
GROUPING SETS ((warehouse, brand), ())
ORDER BY
warehouse NULLS LAST,
brand NULLS LAST;
Natija:
warehouse | brand | sum
---------------+---------+-----
San Francisco | Apple | 200
San Francisco | Samsung | 100
San Jose | Apple | 100
San Jose | Samsung | 50
Texas | Apple | 300
Texas | Samsung | 150
NULL | NULL | 900
Ushbu misolda GROUPING SETS ikkita guruhlashni hosil qiladi:
(warehouse, brand) guruhlash inventarni ombor va brend bo'yicha guruhlaydi.() guruhlash barcha omborlar va brendlarning umumiy yig'indisini ifodalaydi.GROUPING funksiyasi ustunni qabul qiladi va agar u agregatlangan bo'lsa 1, aks holda 0 qaytaradi.
GROUPING(column_name)
Masalan:
SELECT
warehouse,
brand,
GROUPING(warehouse) warehouse_grouping,
GROUPING(brand) brand_grouping,
SUM(quantity) total
FROM
inventory_reports
GROUP BY
GROUPING SETS ((warehouse), (brand), ())
ORDER BY
warehouse NULLS LAST,
brand NULLS LAST;
Natija:
warehouse | brand | warehouse_grouping | brand_grouping | total
---------------+---------+--------------------+----------------+-------
San Francisco | NULL | 0 | 1 | 300
San Jose | NULL | 0 | 1 | 150
Texas | NULL | 0 | 1 | 450
NULL | Apple | 1 | 0 | 600
NULL | Samsung | 1 | 0 | 300
NULL | NULL | 1 | 1 | 900
Natijada:
brand_grouping 1 bo'lgan qatorlar omborlar bo'yicha barcha brendlarning umumiy inventarini ko'rsatadi.warehouse_grouping 1 bo'lgan qatorlar brendlar bo'yicha barcha omborlarning umumiy inventarini ko'rsatadi.warehouse_grouping, ham brand_grouping 1 bo'lgan qator barcha brendlar va omborlarning umumiy yig'indisini ko'rsatadi.Ustun bo'yicha agregatlangan qatorlarni tanlab olish uchun GROUPING funksiyasidan HAVING bandi ichida foydalanishingiz mumkin.
Masalan, quyidagi so'rov brendlar bo'yicha agregatlangan qatorlarni qaytarish uchun GROUPING funksiyasidan foydalanadi:
SELECT
warehouse,
brand,
GROUPING(warehouse) warehouse_grouping,
GROUPING(brand) brand_grouping,
SUM(quantity) total
FROM
inventory_reports
GROUP BY
GROUPING SETS ((warehouse), (brand), ())
HAVING
GROUPING(brand) = 1
ORDER BY
warehouse NULLS LAST,
brand NULLS LAST;
Natija:
warehouse | brand | warehouse_grouping | brand_grouping | total
---------------+-------+--------------------+----------------+-------
San Francisco | NULL | 0 | 1 | 300
San Jose | NULL | 0 | 1 | 150
Texas | NULL | 0 | 1 | 450
NULL | NULL | 1 | 1 | 900
GROUPING SETS dan foydalaning.GROUPING funksiyasi agar ustun agregatlangan bo'lsa 1, aks holda 0 qaytaradi.