แนวคิดนี้ได้รับการอธิบายอย่างดีจากคำตอบที่ยอมรับ แต่ฉันพบว่ายิ่งมีตัวอย่างมากเท่าไหร่ก็ยิ่งดีขึ้นเท่านั้นนี่คือตัวอย่างที่เพิ่มขึ้น
1) บอสพูดว่า "ขอจำนวนสินค้าที่เรามีในสต็อกจัดกลุ่มตามยี่ห้อ"
คุณพูดว่า : "ไม่มีปัญหา"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
ผลลัพธ์:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) หัวหน้าบอกว่า "เอารายการสินค้าทั้งหมดมาให้ฉันพร้อมยี่ห้อและจำนวนสินค้าที่แบรนด์นั้นมี"
คุณอาจลอง:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
แต่คุณจะได้รับ:
ORA-00979: not a GROUP BY expression
นี่คือที่OVER (PARTITION BY BRAND)
มาใน:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
ซึ่งหมายความว่า:
COUNT(ITEM_ID)
- รับจำนวนรายการ
OVER
- เหนือชุดแถว
(PARTITION BY BRAND)
- ที่มียี่ห้อเดียวกัน
และผลลัพธ์คือ:
+--------------+---------------+----------+
| Items | Brand | Count() |
+--------------+---------------+----------+
| Item 1 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 2 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 3 | No brand | 22 |
+--------------+---------------+----------+
| Item 4 | No brand | 22 |
+--------------+---------------+----------+
| Item 5 | H&M | 50 |
+--------------+---------------+----------+
ฯลฯ ...