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]
答案 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
如您所见,我只是重构了您的查询。很少有话要提醒:
当您使用GROUP BY
时,不应将SELECT
中未汇总或未列出的GROUP BY
列表列中的内容更改为子查询。
使用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
请尝试以下脚本。
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
最好的问候, 雷切尔