2014-11-14 322 views
0

我有以下SQL代码,这是不给我我想要的结果。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 

我想最后一列以计数存在该客户端ID,而不是所有存在的汽车保险的汽车总政策。我相信我需要一个嵌套的select语句,以某种方式将所有类似于clientid的结果分组,但最终返回多于一行并抛出错误。

如果我添加:

GROUP BY 
    POLICIES.CLIENTS_ID 

我得到:

Subquery returned more than 1 value. This is not permitted when the.... 

任何帮助将不胜感激! 谢谢

+2

什么是CLIENTS_ID'和'CLIENTCODE'之间'关系的内部查询?您的示例结果显示它是1比1吗?看起来CLIENTS上的左连接完全是多余的。 – 2014-11-14 19:23:02

+0

马丁,你是对的。那里有一点遗漏的sql。我打算在此后不久将数据扩展到另一个表格。谢谢 – evade 2014-11-14 19:27:44

回答

2

您可以使用CASE语句来执行此操作。而不是在SELECT子句中使用子查询:

SUM(CASE WHEN POLICIES.COVCODE = 'AUT' THEN 1 ELSE 0 END) as [AUTO POLICIES] 

正如Martin Smith所指出的那样。如果client_id有多个client_code,那么这会给你每个client_id/client_code组合的记录数。如果client_id与client_code是1:1,那么这会给你每个不同的client_id的记录数,我怀疑你的例子和问题就是这种情况。

无关:您有一个左加入到您的Clients表中,但您在查询的任何地方都不使用您的Clients表。如果您不需要选择或过滤任何字段,请考虑删除它,因为它只是未使用的开销。

+0

谢谢你,我知道,你正在使用case语句作为计数器而不是计算行数。有趣的逻辑,这完美的作品!谢谢 - 就我未使用的加入而言,我将在不久的将来添加数据,并提供良好的眼睛。 – evade 2014-11-14 19:23:57

+1

POLICIES.CNR是NULL状态吗?问题中的子查询计数NOT NULL POLICIES.CNR,但您的SUM不是 – Multisync 2014-11-14 19:30:03

+0

这是@Multisync,但我敢打赌,OP的意图是让那些被排除在外的计数也计算在内。如果不是,派生表将是正确的解决方案。 – JNevill 2014-11-14 19:35:05

2

如果你修改得到计数像

SUM(CASE WHEN POLICIES.COVCODE = 'AUT' THEN 1 ELSE 0 END) as [Auto Policies] 
+0

它们是由'CLIENTS_ID,CLIENTCODE'进行分组的,并且要求用相同的'clientid'来计数。可能不完全一样。 – 2014-11-14 19:24:39

+0

@MartinSmith,从OP发布的查询中,如果我已经理解了正确的话,那么OP的唯一原因就是将它作为子选择的原因,他希望除了正常分组以外的其他条件获得计数。所以这个建议,应该取得正确的结果。 – Rahul 2014-11-14 19:27:07

+0

看起来他们很满意! – 2014-11-14 19:28:44