Ir para conteúdo

Arquivado

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

zanardo

Where - Comando composto

Recommended Posts

Ola pessoal o seguinte preciso de uma ajuda para resolver isso.

 

Estou realizando uma consulta no banco e preciso que muitas informações seja agrupadas e que todas sejam apresentadas pelo mesmo select.

 

vou explicar melhor... vou colocar abaixo a minha query:

 

SELECT

sum(CASE WHEN ordserv.u_emergenc = 'Sim' THEN 1 ELSE 0 END) as SOMA,

count(ordserv.tag),

CENCUS.TAG AS CENTRO_DE_CUSTO

 

FROM ORDSERV

INNER JOIN CENCUS ON ORDSERV.CODCEN=CENCUS.CODCEN AND ORDSERV.CODEMP_3=CENCUS.CODEMP

WHERE

 

cast(ORDSERV.DATPRO2 as date) BETWEEN :Data_Inicial AND :Data_Final

AND ORDSERV.CODEMP=:CODEMP

 

group by CENCUS.TAG

ORDER BY CENCUS.TAG

 

 

------------

 

seguinte, o comando faz a seguinte operação. tenho que listar a soma de ordem de serviço com a condição de emergencia, os codigos dos centro de custo e tambem a quantidade de OS (quantidade total do periodo selecionado). Mas, o que ocorre, os valores deos em emergencia e o agrupamento da soma é feito, mas aparece todas os CC com qauntidade de emergencia 0 zero.

 

Em outras palavras, preciso listar o agrupamento dos centro de custo informando somente os que tiveram OS em emergencia (sua quantidade) e a quantidade de OS (quantidade todas de atendimentos a quele centor de custo).

 

--------

 

Estou tendo esse resultado ...

 

SOMA COUNT CENTRO_DE_CUSTO

---- ----- ---------------

0 1 1001

0 1 1111

0 3 1112

0 2 1113

0 14 1211

0 4 2118

3 8 2211

0 3 2212

1 4 2213

1 3 2312

1 1 2321

0 12 2322

2 2 2330

 

 

o que eu quero fazer apresnetar no select é: sem os CC com a quantidade 0

 

SOMA COUNT CENTRO_DE_CUSTO

---- ----- ---------------

3 8 2211

1 4 2213

1 3 2312

1 1 2321

2 2 2330

 

 

se alguem puder dar uma ajuda eu agradeço, esta chato para resolver isso.

 

Obrigado,

 

renato zanardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que a forma mais simples de resolver seria você jogar o resultado do seu select dentro de uma tabela temporária e depois dar um select nesta temporária filtrando para pegar apenas os registros com valor diferente de zero. Se bem que você pode por no where para filtrar apenas onde o campo do case for igual a sim. Algo do tipo:

 

SELECT sum(CASE WHEN ordserv.u_emergenc = 'Sim' THEN 1 ELSE 0 END) as SOMA,
		   count(ordserv.tag),
CENCUS.TAG AS CENTRO_DE_CUSTO

FROM ORDSERV
INNER JOIN CENCUS ON ORDSERV.CODCEN=CENCUS.CODCEN AND ORDSERV.CODEMP_3=CENCUS.CODEMP
WHERE
		   cast(ORDSERV.DATPRO2 as date) BETWEEN :Data_Inicial AND :Data_Final
		   AND ORDSERV.CODEMP=:CODEMP
		   AND ordserv.u_emergenc = 'Sim' 
group by CENCUS.TAG
ORDER BY CENCUS.TAG

Acho que assim deve funcionar... apesar de que eu no sql server criaria uma procedure e jogaria o resultado da select original numa temp e depois pegaria os valores que quero se o filtro com o ordserv.u_emergenc = 'Sim' falhar.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola!

 

Bem, estive estudando aqui e descobri que eu nao posso estar realizando 2selects pois o resultado ira ser inserido em um construtor de grafico e ele nao aceita, sendo assim terei que fazer tudo em um unico select

 

ai começa o outro problema..... utilizar LEFT OUTER JOIN

 

eu nao consegui ate o momento construir um select que me apresentase o resultado, se alguem puder me ajudar em me mostrar cmomo eu construo um select com left outer join eu agradeceria.

 

para conhecimento, as tabelas seriam:

 

ORDSERV e CENCUS

 

sendo que os campos seriam

 

ORDSERV.EMERGENCIA

ORDSERV.CENCUS

 

Se alguem puder dar uma luz de como eu faço esse left outer join eu agradecerai muito, ate mesmo colocar um exemplo instrutivo para eu mesmo tentar desenvolver.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

vamos melhorar para tentar explicar melhor:

 

eu tenho uma tabela chamada ORDSERV, nessa tabela tenho os campos chamdos U_EMERGENC e U_TAG

 

com isso fazendo um filtro por data e fazendo um inner join na tabela de centro de custo( tabela chamada CENCUS, onde eu tenho o campo DESCRICAO)

 

fazendo o seguinte select eu seleciono a quantidade de Ordem de servico que eu fiz para cada centro de custo.

 

SELECT
 count(ordserv.tag) as OS,		 
 SUBSTRING(CENCUS.DESCRICAO FROM 1 FOR 4) 
 
FROM ORDSERV
INNER JOIN CENCUS ON ORDSERV.CODCEN=CENCUS.CODCEN AND ORDSERV.CODEMP_3=CENCUS.CODEMP
WHERE
	 cast(ORDSERV.DATPRO2 as date) BETWEEN :Data_Inicial AND :Data_Final
	 AND ORDSERV.CODEMP=:CODEMP 
group by  CENCUS.DESCRICAO 
ORDER BY  CENCUS.DESCRICAO

me dando o seguinte reusltado:

OS SUBSTRING

----- ---------

8 CMD

2 CML

5 CMT

1 CMTD

 

Agora eu tenho outo selec, onde esse fazz m filtro somente das ordem de servico que eu realizei em status de emergencia. sendo elas agrupadas por centro de custo.

 

SELECT
sum(CASE WHEN ordserv.u_emergenc = 'Sim'  THEN 1 ELSE 0 END) as EMER,
SUBSTRING(CENCUS.DESCRICAO FROM 1 FOR 4) 
FROM ORDSERV
INNER JOIN CENCUS ON ORDSERV.CODCEN=CENCUS.CODCEN AND ORDSERV.CODEMP_3=CENCUS.CODEMP
WHERE
	 cast(ORDSERV.DATPRO2 as date) BETWEEN :Data_Inicial AND :Data_Final
	 AND ORDSERV.CODEMP=:CODEMP 
	 and ordserv.u_emergenc = 'Sim'
						
group by CENCUS.DESCRICAO	
ORDER BY CENCUS.DESCRICAO

me trazendo o seguinte eresultado:

 

EMER SUBSTRING

---- ---------

8 CMD

1 CMT

1 FDC

1 FHD

 

Agora se eu colocar tudo no mesmo select me aparece o seguinte:

 

OS EMER SUBSTRING

----- ---- ---------

8 8 CMD

2 0 CML

5 1 CMT

1 0 CMTD

5 0 CMV

 

Mas o que eu quero é eliminar do filtro as linhas que falem que: as OS em emergencia fora zero.

 

sendo a resposta:

 

OS EMER SUBSTRING

----- ---- ---------

8 8 CMD

5 1 CMT

 

 

Mas se eu colocar fora de tudo a clausula where ordserv.u_emergenc = 'Sim'

 

O resultado sai errado, sendo ele:

 

OS EMER SUBSTRING

----- ---- ---------

8 8 CMD

1 1 CMT

 

repetindo a quantidade de os em emrgencia no contador de OS do que foi realizado para o CC.

 

 

Se alguem puder me ajudar a separar fazer esse filtro eu agradeço, ja esstou quebrando a cabeça tem 2 dias.

 

Obrigado,

 

Renato Zanardo

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.