Usuário com melhor resposta
Como melhoro essa consulta?

Pergunta
-
Olá pessoal,
Tenho uma subquery que está retornando mais de um resultado. Para tentar resolver o problema, fiz minha consulta da seguinte maneira:
SELECT NOMINAL = UPPER(A.NOMINAL),
(DECLARE @SQLStr VARCHAR(5000)
SET @SQLStr = '' SELECT @SQLStr = @SQLStr + CAST(X.IDBORDERO AS VARCHAR(15)) + ' '
FROM (
SELECT CAST(X.IDBORDERO AS VARCHAR(15)) FROM FBORDERO X (NOLOCK)
WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA) AS Z
SET @SQLStr = LEFT(@SQLStr,len(@SQLStr))
SELECT @SQLStr AS W),
TIPO = (SELECT UPPER(X.NOME) FROM
V_TIPOEXTRATOCAIXA X (NOLOCK)
WHERE X.CODIGO = A.TIPO),
CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO),
ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', CNPJ = C.CGC
FROM FXCX A (NOLOCK)
INNER JOIN FCXA B (NOLOCK) ON (B.CODCXA = A.CODCXA)
INNER JOIN GCOLIGADA C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA)
WHERE A.DATA BETWEEN '2016/01/01'
AND '2016/01/30'
AND A.CODCXA LIKE :CONTA_CAIXA_L
AND A.TIPO IN (3, 7)
GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC
Mas ocorre o seguinte erro na instrução em vermelho.
Msg 102, Level 15, State 1, Line 10 Incorrect syntax near '='. Msg 156, Level 15, State 1, Line 14 Incorrect syntax near the keyword 'AS'. Msg 102, Level 15, State 1, Line 16 Incorrect syntax near ')'. Msg 102, Level 15, State 1, Line 18 Incorrect syntax near ','.
Alguém poderia me ajudar?
Grato,
Ilano
Respostas
-
Você disse que o XML não funciona, mas experimente fazer uns testes com a query abaixo:
SELECT NOMINAL = UPPER(A.NOMINAL), TIPO = (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO), CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO), ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', CNPJ = C.CGC, STUFF ( (SELECT ', ' + CAST(X.IDBORDERO AS VARCHAR(15)) FROM FBORDERO X WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA FOR XML PATH(''), TYPE).value('.', 'varchar(max)') ,1, 2, '') FROM FXCX A (NOLOCK) INNER JOIN FCXA B (NOLOCK) ON B.CODCXA = A.CODCXA INNER JOIN GCOLIGADA C (NOLOCK) ON C.CODCOLIGADA = A.CODCOLIGADA WHERE A.DATA BETWEEN '2016/01/01' AND '2016/01/30' AND A.CODCXA LIKE :CONTA_CAIXA_L AND A.TIPO IN (3, 7) GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC
Se não funcionar, acho melhor você postar a mensagem de erro exibida, citando também a versão do SQL Server que você está utilizando.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Robson William Silva sexta-feira, 11 de novembro de 2016 11:41
Todas as Respostas
-
Você está construindo uma Stored Procedure ou uma query simples? Pois você está misturando SELECT com DECLARE e por aí vai.
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".
Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".
-
Boa tarde,
Como você quer que fique o resultado quando a subquery retorna mais de um resultado?
Assinatura: http://www.imoveisemexposicao.com.br
-
Olá Juliano,
Desde já agradeço sua atenção.
Pois é, era pra ser uma consulta com uma subquery. Como ela traz vários resultados não dá pra rodar a query. Então fiz esse modelo, maluco eu sei, pra ver se vocês poderiam me dar uma luz de como resolvo esse problema. Tem como, numa query deixar tudo separado? Se tiver, como seria?
-
Sim gapimex, a suquery retorna mais de um registro.
Eu tentei fazer usando aquele esquema que tem XML e tal, mas quando inserida a consulta no sistema (TOTVS) não rola. O XML não é interpretado. Sendo assim, tentei essa fórmula maluca rrrssss...
Quero que nessa subquery ele me traga os valores um ao lado do outro seguidos por vírgula ou ponto-e-vírgula, seja como for. O importante é listá-los um ao lado do outro.
-
O que aconteceu exatamente quando você tentou com o XML?
Você pode postar a sua consulta com o XML e a mensagem que é exibida?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
-
Você disse que o XML não funciona, mas experimente fazer uns testes com a query abaixo:
SELECT NOMINAL = UPPER(A.NOMINAL), TIPO = (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO), CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO), ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', CNPJ = C.CGC, STUFF ( (SELECT ', ' + CAST(X.IDBORDERO AS VARCHAR(15)) FROM FBORDERO X WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA FOR XML PATH(''), TYPE).value('.', 'varchar(max)') ,1, 2, '') FROM FXCX A (NOLOCK) INNER JOIN FCXA B (NOLOCK) ON B.CODCXA = A.CODCXA INNER JOIN GCOLIGADA C (NOLOCK) ON C.CODCOLIGADA = A.CODCOLIGADA WHERE A.DATA BETWEEN '2016/01/01' AND '2016/01/30' AND A.CODCXA LIKE :CONTA_CAIXA_L AND A.TIPO IN (3, 7) GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC
Se não funcionar, acho melhor você postar a mensagem de erro exibida, citando também a versão do SQL Server que você está utilizando.
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Robson William Silva sexta-feira, 11 de novembro de 2016 11:41
-
Bom dia,
Devido a falta de interação do autor dessa pergunta,
essa thread está sendo fechada. Caso o problema ainda
esteja ocorrendo, favor abrir uma nova thread.
Atenciosamente,
Robson William Silva
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.