我有一張收據表。每個人都與一項服務相關聯,每個人都有義務為此支付同等費用,除非他們被分配了可以激活/停用的額外費用 (0/1)。所以我使用了一個子查詢來獲得他們必須支付的額外金額,只有在該費用有效的情況下;'fees'表包含user_id、service_id、額外金額和活動標志。然后,我應該得到每人的總數,將額外費用(如果有的話)加到小計中(收據總額減去任何有效的額外費用,然后除以有義務供款的人數)。
SELECT
P.nombre AS person,
S.nombre AS service,
(
SELECT TOTAL(C.value)
FROM fees C
WHERE C.user_id = P.id AND C.service_id = O.service_id AND C.active = 0
) AS fee,
IFNULL(NULL, 23333) AS subtotal,
(fee subtotal) as total
FROM receipts R
LEFT JOIN obligations O ON O.service_id = R.service_id
LEFT JOIN persons P ON O.user_id = P.id
LEFT JOIN services S ON O.service_id = S.id
WHERE R.id = 3 AND O.active = 0;
注意:23333(小計)將替換為“?” 然后我將作為引數傳遞以使用 Golang 執行查詢,該結果我已經從另一個函式獲得
此行出現問題
(fee subtotal) as total
輸出:沒有這樣的列:費用
如果我在沒有該行的情況下運行查詢,它實際上會回傳一個包含有效額外費用和小計的表,但是在嘗試創建最后一列以添加這兩個值時我被卡住了。

謝謝!
編輯
按照 Stefan 的建議,以下是我用來創建表的陳述句:
CREATE TABLE IF NOT EXISTS persons (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER DEFAULT 0); CREATE UNIQUE INDEX per_nom_uindex on persons (name)
CREATE TABLE IF NOT EXISTS services (id INTEGER PRIMARY KEY, name TEXT NOT NULL, active INTEGER DEFAULT 0); CREATE UNIQUE INDEX ser_nom_uindex on services (name)
CREATE TABLE IF NOT EXISTS receipts (id INTEGER PRIMARY KEY, y INTEGER NOT NULL, m INTEGER NOT NULL, service_id INTEGER NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY (service_id) REFERENCES services (id))
CREATE TABLE IF NOT EXISTS fees (id INTEGER PRIMARY KEY, person_id INTEGER NOT NULL, service_id INTEGER NOT NULL, amount INTEGER NOT NULL, active INTEGER DEFAULT 0, FOREIGN KEY(person_id) REFERENCES persons(id), FOREIGN KEY(service_id) REFERENCES services(id))
CREATE TABLE IF NOT EXISTS obligations (id INTEGER PRIMARY KEY, person_id INTEGER NOT NULL, service_id INTEGER NOT NULL, active INTEGER DEFAULT 0, FOREIGN KEY(person_id) REFERENCES persons(id), FOREIGN KEY(service_id) REFERENCES services(id))
uj5u.com熱心網友回復:
考慮將子查詢從SELECTtoJOIN子句(通常稱為派生表)移動,并在 和 上使用聚合GROUP BY對其進行調整。這樣做,這允許您根據需要參考列,甚至避免按行聚合(除非 SQLite 引擎在后臺將其作為單個聚合運行)。user_idservice_id
SELECT
P.nombre AS person,
S.nombre AS service,
C.fee, -- REFERENCE SUBQUERY COLUMN
IFNULL(?, 23333) AS subtotal,
C.fee IFNULL(?, 23333) as total -- REPEAT NEEDED EXPRESSION
FROM receipts R
LEFT JOIN obligations O
ON O.service_id = R.service_id
LEFT JOIN persons P
ON O.user_id = P.id
AND O.active = 0 -- MOVED FROM WHERE CLAUSE
LEFT JOIN services S
ON O.service_id = S.id
LEFT JOIN (
SELECT user_id,
service_id,
TOTAL(value) AS fee
FROM fees
WHERE active = 0
GROUP BY user_id,
service_id
) C ON C.user_id = P.id
AND C.service_id = O.service_id
WHERE R.id = 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/463254.html
