我有兩個表:list_table:
| ID | 名稱 |
|---|---|
| 1 | 一個 |
| 2 | b |
| 3 | C |
vt_table:
| ID | list_id | 數量 | 方向標識 |
|---|---|---|---|
| 1 | 1 | 20 | 1 |
| 2 | 1 | 12 | 2 |
| 3 | 1 | 15 | 1 |
| 4 | 2 | 23 | 1 |
| 5 | 1 | 20 | 1 |
| 6 | 1 | 20 | 2 |
| 7 | 1 | 18 | 1 |
我需要這個結果:數量(dir_id = 1 - dir_id = 2),list_id
| 數量 | list_id |
|---|---|
| 41 | 1 |
| 23 | 2 |
| 0 | 3 |
金額是amount表 vt_table 中所有欄位的總和,其中 direction_id = 1 減去表 vt_table 中所有欄位的總和,amount其中 direction_id = 2
我需要按 對這些計算進行分組list_id,如果表中沒有包含list_id3 的行,例如,金額必須是0。
我正在嘗試使用此查詢來做到這一點:
SELECT vt.list_id
, ((SELECT COALESCE(SUM(vt.amount), 0)
FROM table_name vt
WHERE vt.direction_id = 1)
-
(SELECT COALESCE(SUM(vt.amount), 0)
FROM table_name vt
WHERE direction_id = 2)) AS result
FROM table_name vt
GROUP BY vt.list_id
但我不知道如何正確分組并制作它,以便如果沒有某些條目list_id,那么金額就是0這個list_id。
我使用 PostgreSQL 12。
這里的例子
uj5u.com熱心網友回復:
您可以嘗試使用OUTER JOIN具有功能的條件聚合函式COALESCE。
查詢 1:
SELECT l.id,
SUM(COALESCE(CASE WHEN vt.direction_id = 1 THEN vt.amount END,0)) -
SUM(COALESCE(CASE WHEN vt.direction_id = 2 THEN vt.amount END,0)) AS result
FROM table_name vt
RIGHT JOIN list l ON vt.list_id = l.id
GROUP BY l.id
ORDER BY l.id
結果:
| id | result |
|----|--------|
| 1 | 41 |
| 2 | 23 |
| 3 | 0 |
uj5u.com熱心網友回復:
嘗試這樣的事情,作為開始:
SELECT vt.list_id
, COALESCE(SUM(CASE WHEN direction_id = 1 THEN amount END), 0)
- COALESCE(SUM(CASE WHEN direction_id = 2 THEN amount END), 0) AS result
FROM table_name vt
GROUP BY vt.list_id
;
使用你的小提琴的結果:
| list_id | 結果 |
|---|---|
| 1 | 41 |
| 2 | 23 |
vt這只是錯過了某些串列沒有行的情況。
使用外連接來解決這些情況。
uj5u.com熱心網友回復:
SELECT SUM(CASE WHEN vt.direction_id = 1 THEN vt.amount ELSE 0 END) - SUM(CASE WHEN vt.direction_id = 2 THEN vt.amount ELSE 0 END) as amount,
lt.id as list_id
FROM list_table lt
LEFT OUTER JOIN vt_table vt
ON lt.id = vt.list_id
GROUP BY lt.id
ORDER BY lt.id
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/415514.html
標籤:
下一篇:如何檢查用戶名是否已存在于表中?
