PostgreSQL / Нэгтгэх функцүүд (COUNT, SUM, AVG)

Нэгтгэх функцүүд (COUNT, SUM, AVG)

Та одоо хүснэгтэд мэдээлэл оруулж, уншиж, шинэчилж, устгаж сурлаа. Гэхдээ бодит амьдралд зөвхөн нэг бичлэг уншихаас илүүтэй ерөнхий тооцоо хийх шаардлага байнга гардаг. Жишээ нь: "нийт хэдэн захиалга байна вэ?", "орлогын нийлбэр хэд вэ?", "дундаж үнэ хэд вэ?" гэсэн асуултуудад нэгтгэх функцүүд хариулт өгдөг.

Нэгтгэх функц гэж юу вэ?

Нэгтгэх функц (aggregate function) бол олон мөрийн утгыг нэгтгэж, нэг үр дүн буцаадаг функц юм. PostgreSQL-д хамгийн түгээмэл нэгтгэх функцүүд:

| Функц | Утга | |-------|------| | COUNT() | Мөрийн тоог тоолно | | SUM() | Нийлбэр тооцно | | AVG() | Дундаж тооцно | | MIN() | Хамгийн бага утгыг олно | | MAX() | Хамгийн их утгыг олно |

Жишээ өгөгдөл болгон дараах хүснэгтийг ашиглая:

sql
CREATE TABLE orders (
    id      SERIAL PRIMARY KEY,
    customer TEXT NOT NULL,
    amount  NUMERIC NOT NULL,
    status  TEXT NOT NULL
);

INSERT INTO orders (customer, amount, status) VALUES
    ('Болд',    15000, 'completed'),
    ('Сарнай',  32000, 'completed'),
    ('Ганбаяр',  8000, 'pending'),
    ('Номин',   47000, 'completed'),
    ('Баяр',    12000, 'cancelled'),
    ('Болд',    21000, 'completed');

COUNT — мөр тоолох

COUNT() нь хүснэгтийн нийт мөрийн тоог, эсвэл тодорхой нөхцөлийг хангасан мөрийн тоог буцаана.

sql
-- Нийт захиалгын тоо
SELECT COUNT(*) FROM orders;
-- Үр дүн: 6

-- Зөвхөн "completed" захиалгын тоо
SELECT COUNT(*) FROM orders WHERE status = 'completed';
-- Үр дүн: 4

-- NULL биш утгатай мөрийг тоолох
SELECT COUNT(customer) FROM orders;
-- Үр дүн: 6

COUNT(*) бол бүх мөрийг тоолдог бол COUNT(талбар) нь тухайн талбарын NULL биш утгыг тоолдог. Ихэнх тохиолдолд COUNT(*) ашиглахад хангалттай.

SUM ба AVG — нийлбэр, дундаж

SUM() нь тоон талбарын нийлбэрийг, AVG() нь дунджийг тооцно.

sql
-- Бүх захиалгын нийт дүн
SELECT SUM(amount) FROM orders;
-- Үр дүн: 135000

-- Дундаж захиалгын дүн
SELECT AVG(amount) FROM orders;
-- Үр дүн: 22500.000...

-- Дунджийг бүхэл тоо болгох
SELECT ROUND(AVG(amount), 2) FROM orders;
-- Үр дүн: 22500.00

MIN ба MAX — хамгийн бага, их

sql
-- Хамгийн бага захиалгын дүн
SELECT MIN(amount) FROM orders;
-- Үр дүн: 8000

-- Хамгийн их захиалгын дүн
SELECT MAX(amount) FROM orders;
-- Үр дүн: 47000

-- Олон функцийг нэг асуулгад хослуулах
SELECT
    COUNT(*)            AS нийт_захиалга,
    SUM(amount)         AS нийт_дүн,
    ROUND(AVG(amount), 0) AS дундаж_дүн,
    MIN(amount)         AS хамгийн_бага,
    MAX(amount)         AS хамгийн_их
FROM orders
WHERE status = 'completed';

AS гэсэн түлхүүр үгээр үр дүнгийн баганад нэр өгч болно — энэ нь тайлан, dashboard-д маш хэрэгтэй.

WHERE-тэй хослуулах

Нэгтгэх функцүүдийг WHERE нөхцөлтэй хослуулж, зөвхөн шүүсэн мөрүүдээр тооцоо хийж болно:

sql
-- Зөвхөн 20000-аас дээш захиалгуудын нийт дүн
SELECT SUM(amount) FROM orders WHERE amount > 20000;
-- Үр дүн: 100000

-- "pending" захиалгын дундаж дүн
SELECT ROUND(AVG(amount), 0) AS дундаж
FROM orders
WHERE status = 'pending';

Дараагийн хичээлд:

Нэгтгэх функцүүдийг GROUP BY команд-тай хослуулж, "хэрэглэгч тус бүрийн нийт захиалга хэд вэ?" гэх мэт бүлэглэсэн тооцоо хийж сурна.