none
SUB SELECT DENTRO DO CASE WHEN RRS feed

  • Pergunta

  • Galera, boa tarde, eu estou tentando fazer uma consulta que envolve uma subconsulta dentro do case, porém não esta sendo possivel por que aparece o seguinte erro:

    "Msg 130, Level 15, State 1, Line 8
    Cannot perform an aggregate function on an expression containing an aggregate or a subquery."

    A consulta é a seguinte:

    SELECT  COUNT (Pf.NU_CPF) As Qtd_Cargos_Dirigente

    ,COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO LIKE 'Habilitação%' then Pf.NU_CPF end) As Qtd_Cargos_Dirigente_Habilitado

    ,COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO LIKE 'Habilitação%' AND Pf.NU_CPF in

    (SELECT Distinct Pf.NU_CPF

    FROM [PESSOAS_FISICAS_SPC] Pf

    LEFT JOIN [DIRIGENTES] Dirigentes ON Pf.[ID_CADASTRO_SPC] = Dirigentes.[ID_CADASTRO_SPC]

    LEFT JOIN [CERTIFICACOES] Certificacoes ON Dirigentes.[ID_CADASTRO_SPC] = Certificacoes.[ID_CADASTRO_SPC]

    LEFT JOIN [TIPOS_CERTIFICACOES] AS Tp_Certificacoes ON Certificacoes.[ID_TIPO_CERTIFICACAO] = Tp_Certificacoes.[ID_TIPO_CERTIFICACAO]

    WHERE [NM_TIPO_CERTIFICACAO] not like 'Habilitação%')

     then Pf.NU_CPF end) As Qtd_Cargos_Dirigente_Habilitado_Certificado

    FROM .........

    O objetivo era trazer a quantidade de REGISTRO que contenham em "Tp_Certificacoes.NM_TIPO_CERTIFICACAO" A palavra: 'Habilitação%' (LIKE)

    e  que em contenham em "Tp_Certificacoes.NM_TIPO_CERTIFICACAO" um registro que não contenha a palavra: 'Habilitação%' (NOT LIKE).

    Se alguem puder me da uma força nem que tenha que fazer diferente do que ta feito eu agradeço.


    terça-feira, 16 de agosto de 2016 18:58

Respostas

  • Boa tarde Wanderson tudo bem?

    Da forma que está escrevendo seu select, para cada linha que retornar no select ele irá executar seu sub select, com isso, a performance não será a ideal.

    Nesse caso para simplificar o select e resolver essa situação crie uma tabela virtual com esse sub select e no seu case teste o campo da tabela virtual.

    Veja um exemplo simples.

    SELECT CN.CODIGO, 
    	CN.DESCRICAO,
    	CASE WHEN CN.DESCRICAO LIKE '%CANAL ATACADO%' AND TV.CODIGO = '1004' THEN 
    		1 
    	ELSE 
    		2 END AS TESTE
    FROM SUA_TABELA_1 CN
    LEFT JOIN (
    			SELECT CODIGOCANALCLIENTE, CODIGO
    			FROM SUA_TABELA_2
    		  ) TV ON (TV.CODIGOCANALCLIENTE = CN.CODIGO)


    Atenciosamente, Ruberlei. www.t-sql.com.br

    terça-feira, 16 de agosto de 2016 19:13
  • Boa tarde,

    Wanderson, não sei se entendi corretamente a sua questão, mas experimente fazer uns testes com a query abaixo para ver se é obtido o resultado esperado:

    SELECT Pf.NU_CPF
    FROM [PESSOAS_FISICAS_SPC] Pf
    LEFT JOIN [DIRIGENTES] Dirigentes ON Pf.[ID_CADASTRO_SPC] = Dirigentes.[ID_CADASTRO_SPC]
    LEFT JOIN [CERTIFICACOES] Certificacoes ON Dirigentes.[ID_CADASTRO_SPC] = Certificacoes.[ID_CADASTRO_SPC]
    LEFT JOIN [TIPOS_CERTIFICACOES] AS Tp_Certificacoes ON Certificacoes.[ID_TIPO_CERTIFICACAO] = Tp_Certificacoes.[ID_TIPO_CERTIFICACAO]
    GROUP BY Pf.NU_CPF
    HAVING 
        COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO LIKE 'Habilitação%' then 1 end) > 1 AND
        COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO NOT LIKE 'Habilitação%' then 1 end) > 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 16 de agosto de 2016 20:17

Todas as Respostas

  • Boa tarde Wanderson tudo bem?

    Da forma que está escrevendo seu select, para cada linha que retornar no select ele irá executar seu sub select, com isso, a performance não será a ideal.

    Nesse caso para simplificar o select e resolver essa situação crie uma tabela virtual com esse sub select e no seu case teste o campo da tabela virtual.

    Veja um exemplo simples.

    SELECT CN.CODIGO, 
    	CN.DESCRICAO,
    	CASE WHEN CN.DESCRICAO LIKE '%CANAL ATACADO%' AND TV.CODIGO = '1004' THEN 
    		1 
    	ELSE 
    		2 END AS TESTE
    FROM SUA_TABELA_1 CN
    LEFT JOIN (
    			SELECT CODIGOCANALCLIENTE, CODIGO
    			FROM SUA_TABELA_2
    		  ) TV ON (TV.CODIGOCANALCLIENTE = CN.CODIGO)


    Atenciosamente, Ruberlei. www.t-sql.com.br

    terça-feira, 16 de agosto de 2016 19:13
  • Boa tarde,

    Wanderson, não sei se entendi corretamente a sua questão, mas experimente fazer uns testes com a query abaixo para ver se é obtido o resultado esperado:

    SELECT Pf.NU_CPF
    FROM [PESSOAS_FISICAS_SPC] Pf
    LEFT JOIN [DIRIGENTES] Dirigentes ON Pf.[ID_CADASTRO_SPC] = Dirigentes.[ID_CADASTRO_SPC]
    LEFT JOIN [CERTIFICACOES] Certificacoes ON Dirigentes.[ID_CADASTRO_SPC] = Certificacoes.[ID_CADASTRO_SPC]
    LEFT JOIN [TIPOS_CERTIFICACOES] AS Tp_Certificacoes ON Certificacoes.[ID_TIPO_CERTIFICACAO] = Tp_Certificacoes.[ID_TIPO_CERTIFICACAO]
    GROUP BY Pf.NU_CPF
    HAVING 
        COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO LIKE 'Habilitação%' then 1 end) > 1 AND
        COUNT(case when Tp_Certificacoes.NM_TIPO_CERTIFICACAO NOT LIKE 'Habilitação%' then 1 end) > 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 16 de agosto de 2016 20:17