【问题标题】:How to join multiple tables by selecting the whole values in the first table and some values in the second table如何通过选择第一个表中的整个值和第二个表中的一些值来连接多个表
【发布时间】:2017-09-19 10:10:23
【问题描述】:

我的 sql 查询出现问题。我正在尝试从用户表中获取所有值,并将他们本月在 Loan 表中收集的贷款相加,但每次运行查询时都会出错。

这里是sql查询

SELECT * FROM customer c 
     INNER JOIN(SELECT SUM(loan_amt) as lamt, disb_date, ac_no FROM loans GROUP BY ac_no) AS l ON c.cust_no=l.ac_no

拜托,我做错了什么?谢谢。

【问题讨论】:

标签: php sql sql-server


【解决方案1】:

您在select 中选择的列多于group by 中的列。所以:

SELECT c.*, l.lamt
FROM customer c LEFT JOIN
     (SELECT SUM(loan_amt) as lamt, ac_no
      FROM loans
      GROUP BY ac_no
     ) l
     ON c.cust_no = l.ac_no;

请注意,我还将联接更改为 LEFT JOIN。您的问题专门说“所有行”,这表明即使是没有贷款的行。

【讨论】:

  • 当我想从贷款表中添加另一个,比如说四行时,它输出错误。我会继续对它们进行分组吗?
  • @fagbemiayodele 。 . .您应该将新问题作为问题提出。
【解决方案2】:

试试这个:

SELECT c.*,l.lamt FROM customer c INNER JOIN(SELECT SUM(loan_amt) as lamt, disb_date, ac_no FROM loans GROUP BY ac_no,disb_date) AS l ON c.cust_no=l.ac_no

【讨论】:

  • @KristikaTalwar,我收到此错误:Msg 8120, Level 16, State 1, Line 1 列 'loans.disb_date' 在选择列表中无效,因为它不包含在聚合函数或GROUP BY 子句。
  • 感谢大家的宝贵时间。
  • 检查我的编辑。从选择列表中删除 disb_date 或将其添加到 group by 子句@fagbemiayodele
  • 谢谢它的工作,但是当我想从贷款表中添加另一个,比如说四行时,它输出错误。我会继续对它们进行分组吗?
【解决方案3】:

我同意戈登·林诺夫。这是因为您的 group by 不包括 disb_date 即使它位于子查询的选择部分中。但是,您不想将它添加到您的组中,因为它可能不会产生正确的结果。

我猜您想要 disb_date 是因为您想要检索特定月份的贷款。它是否正确?如果是这样,我会在 Gordon 的解决方案中添加一个 where 子句:

SELECT c.*, l.lamt
FROM customer c LEFT JOIN
     (SELECT SUM(loan_amt) as lamt, ac_no
      FROM loans WHERE disb_date BETWEEN <insert date> AND <insert date>
      GROUP BY ac_no
     ) l
     ON c.cust_no = l.ac_no;

这将显示仅在您指定月份收取的贷款总额。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多