我有以下SQL代码,它没有给我我想要的结果。
SELECT
POLICIES.CLIENTS_ID,
POLICIES.CLIENTCODE,
COUNT(POLICIES.POLICIES_ID) as [Total Policies],
(
SELECT
COUNT(POLICIES.POLICIES_ID)
FROM
POLICIES
WHERE
POLICIES.COVCODE = 'AUT'
) as [Auto Policies]
FROM
POLICIES
LEFT JOIN CLIENTS
ON CLIENTS.CLIENTS_ID = POLICIES.CLIENTS_ID
WHERE
POLICIES.CNR IS NULL
GROUP BY
POLICIES.CLIENTS_ID,
POLICIES.CLIENTCODE
ORDER BY
POLICIES.CLIENTS_ID
我得到这样的结果:
ID CODE Total Auto
3 ABCDE1 1 999999
4 ABCDE2 1 999999
5 ABCDE3 2 999999
6 ABCDE4 2 999999
我希望最后一列能够计算该clientid存在的总自动策略,而不是所有存在的自动策略。我相信我需要一个嵌套的select语句,它以某种方式将所有类似的结果组合在clientid上,但最终会返回多于1行并抛出错误。
如果我添加:
GROUP BY
POLICIES.CLIENTS_ID
我明白了:
Subquery returned more than 1 value. This is not permitted when the....
任何帮助都将非常感激! 谢谢
答案 0 :(得分:2)
您可以使用CASE语句执行此操作。而不是SELECT子句中的子查询使用:
SUM(CASE WHEN POLICIES.COVCODE = 'AUT' THEN 1 ELSE 0 END) as [AUTO POLICIES]
正如马丁史密斯指出的那样。如果client_id有多个client_codes,那么这将为您提供每个client_id / client_code组合的记录计数。如果client_id与client_code为1:1,那么这将为您提供每个不同client_id的记录计数,我怀疑您的示例和问题就是这种情况。
不相关:您对Clients
表有一个LEFT JOIN,但是在查询的任何地方都没有使用Clients
表。如果您不需要选择或过滤任何字段,请考虑将其删除,因为它只是未使用的开销。
答案 1 :(得分:2)
如果您修改内部查询以获取计数到
之类的内容,该怎么办?SUM(CASE WHEN POLICIES.COVCODE = 'AUT' THEN 1 ELSE 0 END) as [Auto Policies]