Usuário com melhor resposta
SUB SELECT DENTRO DO CASE WHEN

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.
- Editado Wanderson custodio de brito terça-feira, 16 de agosto de 2016 18:59
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
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 18 de agosto de 2016 00:05
- Marcado como Resposta Robson William Silva quinta-feira, 18 de agosto de 2016 12:30
- Não Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:50
- Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:50
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 18 de agosto de 2016 00:06
- Marcado como Resposta Wanderson custodio de brito sexta-feira, 19 de agosto de 2016 17:35
- Não Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:51
- Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:51
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
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 18 de agosto de 2016 00:05
- Marcado como Resposta Robson William Silva quinta-feira, 18 de agosto de 2016 12:30
- Não Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:50
- Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:50
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 18 de agosto de 2016 00:06
- Marcado como Resposta Wanderson custodio de brito sexta-feira, 19 de agosto de 2016 17:35
- Não Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:51
- Marcado como Resposta Wanderson custodio de brito sábado, 10 de setembro de 2016 13:51