我有两张桌子:
Bookings (uid INTEGER, in_date DATE, paxname TEXT, acnumber INTEGER)
和
Accounts (uid INTEGER, uidbooking INTEGER, acnumber INTEGER, amount_charged DOUBLE)
我想从账户表中汇总属于预订子集的所有费用。
第一个选择在某个时间段内选择预订......
Select bookings.uid, bookings.acnumber
WHERE bookings.status = 'checkedin'
AND bookings.Indate > '2017-07-01'
现在,SECOND选择应查找这些预订的费用,并将所有属于以前选定预订的帐户金额合并......
Select SUM(amount_charged) FROM Accounts WHERE acnumber = bookings.acnumber
那么,如何通过预订uid,帐号和同一行中的帐户费用总和得到所有结果......?
Thnks
答案 0 :(得分:2)
理论
在SQL中(不仅在SQLite中),这些类型的查询可以通过两种不同的方式完成。
先加入,然后聚合(GROUP BY)或
创建子查询,然后仅聚合匹配的元组。
虽然两种方法都会产生相同的结果,但它们的表现可能会有很大差异。这将取决于的大小 SQL引擎使用的数据库和查询评估算法
您需要的解决方案
SELECT uid, acnumber, SUM(amount_charged)
FROM bookings join accounts USING(uid, acnumber)
WHERE status = 'checkedin' AND b.Indate > '2017-07-01'
GROUP BY uid, acnumber;
WITH Matching AS (SELECT uid, acnumber FROM bookings
WHERE status = 'checkedin' and Indate > '2017-07-01')
SELECT uid, acnumber, SUM(amount_charged)
FROM Accounts
WHERE (uid, acnumber) IN Matching
GROUP BY uid, acnumber;
通常,如果子查询的大小很大,则此查询将比连接运行得慢。但是如果子查询只返回很少的元组,那么它通常会更快。
答案 1 :(得分:0)
使用join plus group语法或查询,如下所示:
s, t, ...
在表格预订中没有字号,所以也许你必须用b.account交换b.acnumber。