一次查询三个表SQLite

时间:2015-04-19 15:45:47

标签: sql sqlite

我需要一些帮助来整理我的查询,这是我第一次遇到需要一次查询三个表因此我有点迷失。

数据库如下所示:

1[COMPANY]  --- <has> --- *[ACCOUNTS]1  --- <has> --- *[PAYMENTS]

Table COMPANY  has columns: CompID | CompanyName  |
Table ACCOUNTS has columns: AccID  | Name         | Company     |
Table PAYMENTS has columns: PayID  | GroupID      | PaymentDue  | DateDue

其中Company引用CompID和GroupID引用AccID。

我需要:

  1. 获取所有公司
  2. 获取公司
  3. 下的帐户数量
  4. 根据与当前日期最接近的日期,在公司中支付账户的所有付款。
  5. 这就是我的显示效果:

     COMPANY      | No. of ACCOUNTS | TOTAL DUE        | DATE DUE 
     'Comp 1'     |       3         | 10000            | 4/30/2015            
     'Comp 2'     |       2         | 8000             | 4/30/2015      
    

    一个接一个地做这个很容易(除了第3个,我不知道如何完成它)但是让它们全部融入这么多条件让我感到困惑。任何人都可以让我大致了解这个案例的查询是什么样的吗?

    修改

    我只需要支付最接近当前日期的付款,任何不属于“最接近当前日期”的东西都是无关紧要的。

    另外,我只需要最接近的UPCOMING日期​​,所以在当前日期之前的任何内容都被认为是无关紧要的。

2 个答案:

答案 0 :(得分:0)

SELECT Company, COUNT(AccID), SUM(PaymentDue), MIN(DateDue)

FROM PAYMENTS JOIN ACCOUNTS
ON PAYMENTS.GroupID = ACCOUNTS.AccID 
JOIN COMPANY
ON ACCOUNTS.Company = COMPANY.CompID)

GROUP BY Company

我没有测试过这段代码,但这应该适用于SQLite

答案 1 :(得分:0)

尝试:

select      c.compid,
            ifnull(count(distinct a.accid),0) as num_accounts,
            ifnull(count(*),0) as num_payments
from        company c
  left join accounts a
         on c.compid = a.company
  left join (   select      p.*
                from        payments p
                       join (
                                select      groupid,
                                            min(datedue) as next_due
                                from        payments
                                where       datedue >= date('now');
                                group by    groupid
                            ) v
                         on p.groupid = v.groupid
                        and p.date_due = v.next_due
            ) v
         on p.groupid = v.groupid
group by    c.compid

当你说:第三个标准对我来说并不完全清楚: “根据与当前日期最近的日期,公司账户的所有付款总额。” 我将此解释为您只希望与每个帐户关联的最近date_due相关的付款(相对于当前日期)。换句话说,在此日期之前没有到期付款,也没有在该日期之后到期的付款。