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

Sql 使用另一个查询的结果执行聚合操作(求和),sql,sqlite,Sql,Sqlite,我有两张桌子: Bookings (uid INTEGER, in_date DATE, paxname TEXT, acnumber INTEGER) 及 我想汇总accounts表中属于预订子集的所有费用 第一个选项选择特定时间段内的预订 Select bookings.uid, bookings.acnumber WHERE bookings.status = 'checkedin' AND bookings.Indate > '2017-07-01' 现在,第二个选择应该查

我有两张桌子:

Bookings (uid INTEGER, in_date DATE, paxname TEXT, acnumber INTEGER) 

我想汇总accounts表中属于预订子集的所有费用

第一个选项选择特定时间段内的预订

Select bookings.uid, bookings.acnumber
WHERE bookings.status = 'checkedin' 
AND bookings.Indate > '2017-07-01'
现在,第二个选择应该查找这些预订的费用,并将属于先前选择的预订的所有帐户金额相加

Select SUM(amount_charged) FROM Accounts WHERE acnumber = bookings.acnumber
那么,我如何才能得到所有的结果与预订uid,帐号和在同一行,帐户费用的总和


Thnks

使用join plus组语法或查询,如下所示:

SELECT b.uid, b.acnumber,SUM(a.amount_charged) 
FROM bookings b, accounts a 
WHERE b.acnumber = a.acnumber 
AND b.status = 'checkedin' 
AND b.Indate > '2017-07-01'
GROUP BY b.uid,b.acnumber;

在预订表中没有acnumber,因此您可能需要将b.acnumber与b.account交换。

理论

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

  • 先加入,然后聚合(分组依据),或

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

  • 虽然这两种方法将产生相同的结果,但它们的性能可能会显著不同。这将取决于设备的大小 SQL引擎使用的数据库和查询求值算法

    您需要的解决方案

  • 使用联接:我更喜欢显式联接(使代码更可读)
  • 使用子查询:

  • 通常,如果子查询的大小很大,则此查询的运行速度将慢于联接。但是如果子查询只返回几个元组,它通常会更快。

    这似乎没问题。。唯一的缺点是账户为空(没有记录)的预订不会返回零,它们只是不显示。。。(我希望为空或零)。。。。但是我想可以在我这边添加一些代码来检查一下……在这里,你需要像这样的左或右连接:
    SELECT。。。从预订b向左加入b.acnumber=a.acnumber上的帐户a,其中b.status…
    SELECT b.uid, b.acnumber,SUM(a.amount_charged) 
    FROM bookings b, accounts a 
    WHERE b.acnumber = a.acnumber 
    AND b.status = 'checkedin' 
    AND b.Indate > '2017-07-01'
    GROUP BY b.uid,b.acnumber;
    
        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;