对两个 SQLite 列求和,当它们是子查询时
Sum two SQLite columns, when they're subqueries
我有 table 的收据。每个人都与一项服务相关联,每个人都有义务为此支付同等费用,除非他们被分配了额外费用,可以是 activated/deactivaded (0/1)。所以我使用子查询来获取他们必须支付的额外金额,只有在该费用有效时; table'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
输出:没有这样的列:费用
如果我 运行 没有该行的查询,它实际上会 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_id
和 service_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
我有 table 的收据。每个人都与一项服务相关联,每个人都有义务为此支付同等费用,除非他们被分配了额外费用,可以是 activated/deactivaded (0/1)。所以我使用子查询来获取他们必须支付的额外金额,只有在该费用有效时; table'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
输出:没有这样的列:费用
如果我 运行 没有该行的查询,它实际上会 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_id
和 service_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