内部联接与第二个表的一列之和

时间:2018-12-16 04:56:28

标签: sql sql-server sql-server-2008

SELECT accounts.lconm, accounts.netname, accounts.adress, totsls.total 
FROM accounts 
INNER JOIN (SELECT activestb, SUM(billamnt) AS total 
            FROM bills 
            GROUP BY bils.acc) totals ON totals.acc = accounts.acc 
WHERE acc = 1

我想用此查询求第二张表(bills)中的billamnt的总和,但是在SQL Server Compact Edition 2008中出现错误。

错误消息是:

  

主要错误0x80040E14,次要错误25515   从左外部联接的帐户中选择accounts.lconm,accounts.netname,accounts.adress,totsls.total   (从bils.acc的帐单组中选择activestb,sum(billamnt)作为总计)totals.acc = accounts.acc上的总计,其中acc = 1
  在聚合和分组表达式中,SELECT子句只能包含聚合和分组表达式。 [Select子句=,activestb]

4 个答案:

答案 0 :(得分:0)

应如下所示:

select accounts.lconm,accounts.netname, accounts.adress, totsls.total,accounts.acc from accounts 
left outer join 
(select activestb,bills.acc,sum(billamnt) as total from bills group by bills.acc,bills.activestb)totals
on totals.acc=accounts.acc where totals.acc=1

答案 1 :(得分:0)

尝试此查询:

SELECT a.lconm,
       a.netname,
       a.adress,
       t.total 
FROM accounts a
INNER JOIN (
    SELECT acc, SUM(billamnt) AS total 
    FROM bills 
    GROUP BY acc
) t ON t.acc = a.acc 
WHERE a.acc = 1

如您所见,我只是重构了您的查询。很少有话要提醒:

  1. 当您使用GROUP BY时,不应将SELECT中未汇总或未列出的GROUP BY列表列中的内容更改为子查询。

  2. 使用JOIN时,最好在整个查询中使用表别名,而您不在WHERE子句中。没关系,当列名唯一时(在您的情况下不是)(两个查询中都存在acc列)。

此外,我更喜欢短别名(这可能会降低可读性),但是ift只是我的偏爱。

还请注意,我对查询的格式有所不同。正确的格式对于提高代码的可读性至关重要:)

答案 2 :(得分:0)

查询中的问题是子查询中的GROUP BY子句。它需要引用子查询中的列。此外,acc表和子查询中都存在accounts,因此您需要限定该列。

因此,这名义上可以解决您的问题:

SELECT a.lconm, a.netname, a.adress, b.total 
FROM accounts a INNER JOIN
     (SELECT b.acc, SUM(b.billamnt) AS total 
      FROM bills b
      GROUP BY bils.acc
     ) b
     ON b.acc = a.acc 
WHERE a.acc = 1;

但是,这是编写查询的一种低效方式,因为所有账单都必须汇总,而您仅选择其中之一。一种解决方案是在子查询中重复where子句。这可能很麻烦并且容易出错。

另一个解决方案是相关子查询:

SELECT a.lconm, a.netname, a.adress,
       (SELECT SUM(b.billamnt) AS total 
        FROM bills b
        WHERE b.acc = a.acc 
       ) as total
FROM accounts a INNER JOIN
WHERE a.acc = 1;

这仅对给定帐户的bills中的金额进行求和。使用bills(acc, billamnt)上的索引,它应该非常快。

答案 3 :(得分:0)

根据官方文档,‘该列必须出现在SELECT语句的FROM子句中,但不要求出现在SELECT列表中。但是,列表中任何非聚合表达式中的每个表或视图列都必须包含在GROUP BY列表中,这将指示您的错误原因。

有关更多详细信息,您可以参考此链接,您将看到有关您的问题的一些示例:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-2017#arguments

有一个很好的例子为您解释:https://www.codeproject.com/Articles/1110163/%2FArticles%2F1110163%2FSQL-GROUP-By-and-the-Column-name-is-invalid-in-the

请尝试以下脚本。

SELECT accounts.lconm, accounts.netname, accounts.adress, totsls.total 
FROM accounts 
INNER JOIN (SELECT activestb,acc, SUM(billamnt) AS total 
            FROM bills 
            GROUP BY acc,activestb) totals ON totals.acc = accounts.acc 
WHERE acc = 1

最好的问候, 雷切尔