【问题标题】:SQL Inner Join querySQL 内连接查询
【发布时间】:2013-07-06 07:25:14
【问题描述】:

我有以下表结构,

cust_info

   cust_id
   cust_name

bill_info

    bill_id
    cust_id
    bill_amount
    bill_date

付费信息

    paid_id
    bill_id
    paid_amount  
    paid_date

现在我的输出应显示两个 bill_dates 日期之间的记录(2013 年 1 月 1 日至 2013 年 2 月 1 日),如下所示,

 cust_name | bill_id | bill_amount | tpaid_amount | bill_date | balance

tpaid_amount 是为特定 bill_id 支付的总金额

例如,

  • 对于bill id abcd,bill_amount 为10000,用户支付一次2000,第二次支付3000

  • 意思是,paid_info 表包含两个相同 bill_id 的条目

    bill_id | paid_amount
    abcd         2000
    abcd         3000
    

所以,tpaid_amount = 2000 + 3000 = 5000balance = 10000 - tpaid_amount = 10000 - 5000 = 5000

有没有办法通过单个查询(内部联接)来做到这一点?

【问题讨论】:

    标签: sql inner-join


    【解决方案1】:

    您想加入这 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
    

    group by 的快速概览:它会将您的结果集和 smoosh 行放在一起,具体取决于它们在您提供的列中具有相同数据的位置。由于每张账单都有相同的客户名称、金额、日期等,我们可以按这些以及账单 ID 进行分组,我们将获得每张账单的记录。但是,如果我们想按 p.paid_amount 对其进行分组,因为每次付款都会有不同的付款(可能),您将获得每笔付款的记录,而不是每张账单,这不是您的记录我想要。一旦 group by 将这些行平滑在一起,您就可以运行聚合函数,例如 SUM(column)。在此示例中,SUM(p.paid_amount) 将具有该 bill_id 的所有付款加起来以计算已支付的金额。如需更多信息,请查看 W3Schools chapter on group by 的 SQL 教程。

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

    【讨论】:

    • 感谢克雷格,它成功了!但我不太了解这个查询是如何传播的,因为我是 sql 新手...... :)
    • @Nikhil,好的,我已经用一些 cmets 和解释扩展了我的答案,希望能让事情变得更清楚一些。希望这会有所帮助。
    【解决方案2】:

    这样就可以解决问题了;

    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
    

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2016-03-29
      • 2015-06-21
      • 1970-01-01
      • 2011-04-15
      • 2018-03-23
      • 2013-04-26
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多