对两个 SQLite 列求和,当它们是子查询时

Sum two SQLite columns, when they're subqueries

我有 table 的收据。每个人都与一项服务相关联,每个人都有义务为此支付同等费用,除非他们被分配了额外费用,可以是 activated/deactivaded (0/1)。所以我使用子查询来获取他们必须支付的额外金额,只有在该费用有效时; table'fees'包含user_idservice_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

输出:没有这样的列:费用

如果我 运行 没有该行的查询,它实际上会 return 一个 table 包含有效的额外费用和小计,但我在尝试创建一个添加这两个值的最后一列。

谢谢!


编辑

按照 Stefan 的建议,这是我用来创建 tables 的语句:

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))

考虑将子查询从 SELECT 移动到 JOIN 子句(通常称为派生 table)并使用 GROUP BY 聚合对 user_idservice_id。这样做,您可以根据需要引用该列,甚至可以避免按行聚合(除非 SQLite 引擎在后台将其作为单个聚合运行)。

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