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,好的,我用一些评论和解释扩展了我的答案,希望能让事情变得更清楚一些。希望这有帮助。