SQL内部联接查询

SQL内部联接查询,sql,inner-join,Sql,Inner Join,我有以下表格结构 客户信息 cust_id cust_name 账单信息 bill_id cust_id bill_amount bill_date paid_id bill_id paid_amount paid_date 付费信息 bill_id cust_id bill_amount bill_date paid_id bill_id paid_a

我有以下表格结构

客户信息

   cust_id
   cust_name
账单信息

    bill_id
    cust_id
    bill_amount
    bill_date
    paid_id
    bill_id
    paid_amount  
    paid_date
付费信息

    bill_id
    cust_id
    bill_amount
    bill_date
    paid_id
    bill_id
    paid_amount  
    paid_date
现在,我的输出应显示两个
账单日期之间的记录(2013年1月1日至2013年2月1日),如下所示:

 cust_name | bill_id | bill_amount | tpaid_amount | bill_date | balance
其中,
tpaid\u amount
是特定账单id的支付总额

比如说,

  • 对于账单id abcd,账单金额为10000,用户一次支付2000,二次支付3000

  • 表示“已付款信息”表包含相同账单id的两个条目

    bill_id | paid_amount
    abcd         2000
    abcd         3000
    
因此,
tpaid\u金额=2000+3000=5000
余额=10000-tpaid\u金额=10000-5000=5000


单查询(内部联接)有什么方法可以做到这一点吗?

您希望联接这3个表,然后按账单ID和其他相关数据对它们进行分组,如下所示

-- the select line, as well as getting your columns to display, is where you'll work 
-- out your computed columns, or what are called aggregate functions, such as tpaid and balance
SELECT c.cust_name, p.bill_id, b.bill_amount, SUM(p.paid_amount) AS tpaid, b.bill_date, b.bill_amount - SUM(p.paid_amount) AS balance
-- joining up the 3 tables here on the id columns that point to the other tables
FROM cust_info c INNER JOIN bill_info b ON c.cust_id = b.cust_id
INNER JOIN paid_info p ON p.bill_id = b.bill_id
-- between pretty much does what it says
WHERE b.bill_date BETWEEN '2013-01-01' AND '2013-02-01'
-- in group by, we not only need to join rows together based on which bill they're for
-- (bill_id), but also any column we want to select in SELECT. 
GROUP BY c.cust_name, p.bill_id, b.bill_amount, b.bill_date
快速概述GroupBy:它将根据结果集和smoosh行在您提供的列中具有相同数据的位置,将它们放在一起。由于每个账单都有相同的客户名称、金额、日期等,我们可以根据这些以及账单id进行分组,我们将获得每个账单的记录。但是,如果我们想按p.paid_金额对其进行分组,因为每次付款都会有不同的一次(可能),因此您会得到每次付款的记录,而不是每张账单的记录,这不是您想要的。一旦GROUPBY将这些行压缩在一起,就可以运行聚合函数,例如SUM(column)。在本例中,SUM(p.paid_amount)将具有该账单id的所有付款相加,计算出已支付的金额。有关更多信息,请参阅W3Schools的SQL教程


希望我正确地理解了这一点,并且这对您有所帮助。

这将起到作用

select
    cust_name,
    bill_id,
    bill_amount,
    sum(paid_amount),
    bill_date,
    bill_amount - sum(paid_amount)
from
    cust_info
    left outer join bill_info
        left outer join paid_info
        on bill_info.bill_id=paid_info.bill_id
    on cust_info.cust_id=bill_info.cust_id
where
    bill_info.bill_date between X and Y
group by
    cust_name,
    bill_id,
    bill_amount,
    bill_date

谢谢克雷格,成功了!但是我不太了解这个查询是如何传播的,因为我是sql新手……:)@Nikhil,好的,我用一些评论和解释扩展了我的答案,希望能让事情变得更清楚一些。希望这有帮助。