使用另一个查询的结果执行聚合操作(SUM)

时间:2017-07-27 21:41:14

标签: sql sqlite

我有两张桌子:

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

2 个答案:

答案 0 :(得分:2)

理论

在SQL中(不仅在SQLite中),这些类型的查询可以通过两种不同的方式完成。

  1. 先加入,然后聚合(GROUP BY)或

  2. 创建子查询,然后仅聚合匹配的元组。

  3. 虽然两种方法都会产生相同的结果,但它们的表现可能会有很大差异。这将取决于的大小 SQL引擎使用的数据库和查询评估算法

    您需要的解决方案

    1. 使用连接:我更喜欢显式连接(使代码更具可读性)
    2.     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;
      1. 使用子查询:
      2.     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。