SQL嵌套选择语句

时间:2014-11-14 19:18:25

标签: sql sql-server select

我有以下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....

任何帮助都将非常感激! 谢谢

2 个答案:

答案 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]