Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DaniloTec

[Resolvido] Consulta trazendo muitos registros nulos

Recommended Posts

Boa tarde, gente.

Fiz uma query pra trazer os resultados que precisava, mas o problema é que está trazendo muitos resultados nulos.

Query:

set dateformat dmy
select idFormulario,dtFim, (Case idPergunta When 74 Then txtResposta End) [Nome], (Case idPergunta When 75 Then txtResposta End) [Endereço], (Case idPergunta When 77 Then txtResposta End) [Cidade], (Case idPergunta When 79 Then txtResposta End) [Telefone], (Case idPergunta When 80 Then txtResposta End) [Celular], (Case idPergunta When 82 Then txtResposta End) [Estado Civil], (Case idPergunta When 83 Then txtResposta End) [E-mail], (Case idPergunta When 84 Then txtResposta End) [Atividade Profissional], (Case idPergunta When 140 Then txtResposta End) [Estado], (Case idPergunta When 379 Then txtResposta End) [Bairro] from arterenato_smart.PESQ_RespostasColetadas where idPesquisa = 43 and idPergunta in (74,75,77,79,80,82,83,84,140,379) and dtFim between convert(datetime,'01/11/2009',103) and convert(datetime,'11/11/2009',103) order by idFormulario,idPergunta

É a primeira vez que estou utilizando esta clausula CASE e não sei se estou fazendo da forma correta.

 

Vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acredito que ele cria uma linha pra cada CASE. Mesmo colocando o GROUP BY eu não consigo alinhar tudo em uma só.

Não estou conseguindo encontrar outra forma de fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo....

Pelo print eu acho que você vai ter que usar uma funcao chamada PIVOT.....

 

Aqui tem um exemplo bem bacana:

http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/b344d64a-cce4-4ab4-aa47-7eb6225468cc/

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, Jus2ka. Pelo que pude ver, o PIVOT não existe no sql 2000.

Estou fazendo vários testes e não estou encontrando uma forma de aplicá-lo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando seguir este artigo: http://www.devmedia.com.br/articles/viewcomp.asp?comp=5292

Fiz a query como o autor sugeriu:

 

select idFormulario
	, Nome = (case when idPergunta = 74 then txtResposta end)
	, Telefone = (case when idPergunta = 79 then txtResposta end)
from arterenato_smart.PESQ_RespostasColetadas 
group by idFormulario
order by idFormulario

Mas ocorre o seguinte erro:

 

Msg 8120, Level 16, State 1, Line 21

Column 'arterenato_smart.PESQ_RespostasColetadas.txtResposta' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Msg 8120, Level 16, State 1, Line 21

Column 'arterenato_smart.PESQ_RespostasColetadas.idPergunta' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Msg 8120, Level 16, State 1, Line 21

Column 'arterenato_smart.PESQ_RespostasColetadas.txtResposta' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Msg 8120, Level 16, State 1, Line 21

Column 'arterenato_smart.PESQ_RespostasColetadas.idPergunta' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Compartilhar este post


Link para o post
Compartilhar em outros sites

agrupa este campo txtResposta e ve o resultado.... mas ainda acho que esta errado...

 

que versao você esta usando??? 2000? vou tentar fazer um exemplo agora imaginando a estrutura dos campos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo... ve se isso aki te ajuda:

 

http://forum.imasters.com.br/index.php?/topic/224865-transformando-varias-linhas-em-uma-so-coluna/

 

eu sabia que tinha visto em algum lugar ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, mano. Na boa, agradeço a ajuda, mas não entendi bolhufas do que está escrito.

Nem consegui encontrar semelhança no que estou tentando fazer, :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

bolhufas foi boa rs

mas vamos a seu problema http://forum.imasters.com.br/public/style_emoticons/default/devil.gif

 

Estou montando esta estrutura:

CREATE TABLE 
	##PESQ_RESPOSTASCOLETADAS 
		(IDFORMULARIO INT, NOME VARCHAR(50), TELEFONE VARCHAR(50), IDPERGUNTA INT, TXTRESPOSTA VARCHAR(50))


INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1,'NOME1','TELEFONE1', 74,'NOME1')
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1,'NOME1','TELEFONE2', 79,'telefone1')
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1,'NOME2','TELEFONE3', 74,'NOME2')
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1,'NOME2','TELEFONE4', 79,'telefone2')


SELECT * FROM ##PESQ_RESPOSTASCOLETADAS


DROP TABLE ##PESQ_RESPOSTASCOLETADAS


Eh parecido com a estrutura que tu tem ai?

Se nao for, tem como passar um modelo do que tem?

 

vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tenho esta query:

select idFormulario,idPergunta,txtResposta, dtFim
from arterenato_smart.PESQ_RespostasColetadas
where idPesquisa = 43
and idPergunta in (79,74,75,83,80,84,82,379,77,140)
and dtFim between convert(datetime,'01/11/2009',103) and convert(datetime,'11/11/2009',103)
order by idFormulario,idPergunta

Que trás o seguinte resultado:

http://www.mdconline.com.br/download/sqlImagem1.jpg

 

Eu preciso deste resultado de outra forma, ele me trás uma base vertical e eu perciso de uma horizontal.

http://www.mdconline.com.br/download/imgSelectCadastro.jpg

 

Só não sei como tirar estes nulos da tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora sim....

estou fazendo um exemplo a partir das imagens.... tem gtalk? se tiver, me add ai:

********

acho que eh mais facil para a gente se falar e depois postar o resultado para o pessoal que precisar ...

 

abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo, veja se isto te serve:

 



if exists (select * from tempdb.sys.sysobjects where xtype = 'u' and name = '##PESQ_RESPOSTASCOLETADAS')
drop table ##PESQ_RESPOSTASCOLETADAS



if exists (select * from tempdb.sys.sysobjects where xtype = 'u' and name = '##TEMP')
drop table ##TEMP



CREATE TABLE 
	##PESQ_RESPOSTASCOLETADAS 
		(IDFORMULARIO INT, 
		 IDPERGUNTA INT,
		 TXTRESPOSTA VARCHAR(50), 
		 dtfim datetime
		)


INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 74, 'JUNIOR', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 75, 'RUA A, NUMERO 1', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 77, 'SAO PAULO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 79, '+5511190', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 80, ' ', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 82, 'CASADO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 83, 'adjuniordba@googlemail.com', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 84, 'DBA SQLSERVER', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 140, 'SP', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 379, 'BROOKLIN', GETDATE())


INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 74, 'DANILO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 75, 'RUA B, NUMERO 2', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 77, 'SAO PAULO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 79, '+5511193', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 80, ' ', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 82, 'NAO INFORMADO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 83, 'email', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 84, 'DBA / PROGRAMADOR', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 140, 'SP', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 379, 'NAO INFORMADO', GETDATE())


SELECT 
NOME = (SELECT TXTRESPOSTA 
	FROM ##PESQ_RESPOSTASCOLETADAS 
	WHERE IDPERGUNTA = 74 
		AND IDFORMULARIO = A.IDFORMULARIO
		) ,
ENDERECO = (SELECT  TXTRESPOSTA 
	FROM ##PESQ_RESPOSTASCOLETADAS 
	WHERE IDPERGUNTA = 75 
		AND IDFORMULARIO = A.IDFORMULARIO
		) ,
CIDADE = (SELECT  TXTRESPOSTA 
	FROM ##PESQ_RESPOSTASCOLETADAS 
	WHERE IDPERGUNTA = 77 
		AND IDFORMULARIO = A.IDFORMULARIO
		) 
	
INTO ##TEMP
		
FROM ##PESQ_RESPOSTASCOLETADAS A


SELECT DISTINCT NOME, ENDERECO, CIDADE FROM ##TEMP





Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, jus2ka. Eu tinha feito algo parecido. Fiz novamente, conforme você disse, mas a query demora mais de 40 segundos pra trazer. Isso é viável em uma aplicação?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao... viavel a meu ver nao.... 40 segundos dependendo da aplicacao eh uma eternidade.....

O que pode melhorar eh a criacao de indices em alguns campos (como o TXTRESPOSTA)

Pode tb dar uma olhada no Execution Plan (nao lembro no SQL2000 onde fica) que analisa o gargalo....

 

Tem um jeito de se fazer com o case mas como meu SQL eh o 2008 fica um pouco complicado simular.....

 

vou tentar mais tarde fazer um exemplo com o case, mas nao sei se a performance dele vai melhorar em algo....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo do jeito que está, demorando quase um minuto, não consigo colocar na aplicação.

Dá erro de timeout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha eu de novo rsrs

Danilo, vamos tentar com o case novamente, mas desta vez um caso diferente:

if exists (select * from tempdb.sys.sysobjects where xtype = 'u' and name = '##PESQ_RESPOSTASCOLETADAS')
drop table ##PESQ_RESPOSTASCOLETADAS

if exists (select * from tempdb.sys.sysobjects where xtype = 'u' and name = '##TEMP')

drop table ##TEMP


CREATE TABLE         ##PESQ_RESPOSTASCOLETADAS 
                (IDFORMULARIO INT,
                IDPERGUNTA INT,
                TXTRESPOSTA VARCHAR(50),
                dtfim datetime )
                                                                     
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 74, 'JUNIOR', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 75, 'RUA A, NUMERO 1', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 77, 'SAO PAULO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 79, '+5511190', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 80, ' ', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 82, 'CASADO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 83, 'adjuniordba@googlemail.com', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 84, 'DBA SQLSERVER', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 140, 'SP', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (1, 379, 'BROOKLIN', GETDATE())

INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 74, 'DANILO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 75, 'RUA B, NUMERO 2', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 77, 'SÃO PAULO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 79, '+5511193', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 80, ' ', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 82, 'NAO INFORMADO', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 83, 'email', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 84, 'DBA / PROGRAMADOR', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 140, 'SP', GETDATE())
INSERT INTO ##PESQ_RESPOSTASCOLETADAS VALUES (2, 379, 'NAO INFORMADO', GETDATE())



select 	
 'NOME'		= MAX (CASE WHEN IDPERGUNTA = 74 THEN TXTRESPOSTA ELSE '' END) ,
 'TELEFONE' = MAX (CASE WHEN IDPERGUNTA = 75 THEN TXTRESPOSTA ELSE '' END),
 'CIDADE'	= MAX (CASE WHEN IDPERGUNTA = 77 THEN TXTRESPOSTA ELSE '' END)
FROM ##PESQ_RESPOSTASCOLETADAS A
group by A.IDFORMULARIO

Acho que funciona para você.... como te falei, em meus servidores soh tenho sql 2005 e 2008 =\

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mano, vou fazer uns testes com o que você me passou, mas acho que matou o problema.

Vou realizar uns testes e posto pra ver se está certinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.