Ir para conteúdo

POWERED BY:

Arquivado

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

Paulo Jardim

Nomes diferentes a mesma coluna

Recommended Posts

Galera,

 

tenho a seguinte consulta

 

SELECT Loja.cod_loja, Declaracao.data_declaracao, SUM(Itens_Declaracao.valor) FROM Itens_Declaracao
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja


WHERE Declaracao.data_declaracao  BETWEEN ('2011-01-01') AND ('2011-12-31')
AND Declaracao.cod_loja = 1020
AND Declaracao.cod_tipo_declaracao = 4
GROUP BY Declaracao.data_declaracao, Loja.cod_loja

 

 

só que além de retornar Declaracao.cod_tipo_declaracao = 4 gostaria tb que retornase em outra coluna o resultado de outro select ex:

 

Declaracao.cod_tipo_declaracao = 3 ou 2 ou 1 e assim por diante.

 

COmo posso fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

AND (Declaracao.cod_tipo_declaracao = 1 or Declaracao.cod_tipo_declaracao = 2 or Declaracao.cod_tipo_declaracao = 3)

 

ou

AND (Declaracao.cod_tipo_declaracao <= 4)

Compartilhar este post


Link para o post
Compartilhar em outros sites
eu preciso em colunas diferentes

 

Aqui entra o CASE.

 

SELECT Loja.cod_loja, Declaracao.data_declaracao, 
SUM( (case when Declaracao.cod_tipo_declaracao in (1,2,3) then Itens_Declaracao.valor else 0 end)) valor123,
SUM( (case when Declaracao.cod_tipo_declaracao in (4) then Itens_Declaracao.valor else 0 end)) valor4
FROM Itens_Declaracao
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja
WHERE Declaracao.data_declaracao  BETWEEN ('2011-01-01') AND ('2011-12-31')
AND Declaracao.cod_loja = 1020
AND Declaracao.cod_tipo_declaracao in (1,2,3,4)
GROUP BY Declaracao.data_declaracao, Loja.cod_loja

Compartilhar este post


Link para o post
Compartilhar em outros sites

A entendi mota nçao sabia que podia fazer isso...

 

Mais assim o meu problema é o seguinte.

 

EU vou preencher um grid com 3 valores diferentes, pois cada tipo de declaração tem totais diferentes.

 

ou seja eu quero retornar os totais ao mesmo tempo e colocar em 3 tabelas diferentes.

 

EX:

 

   data        tipo declaracao 1         tipo declaracao 2        tipo declaracao 3            Qual é o maior
01-01-2011           2000                        3000                    2500                             3000
02-01-2011           500                          100                     300                             500

TOTAL               2500                         3100                     5800                            3500

 

meu grid que vou apresentar os dados se parece com o de cima...

 

Minha tabela de declaracao tem a data

a minha tabela de itens de declaracao tem os valores do qual eu posso tirar o total filtrado por tipo.

Assim eu posso ter o total do tipo de declaracao 1 e do 2 e assim por diante.

 

Caso eu fosse fazer selects separados, que tb é viável, eu cairia no problema seguinte:

 

O primeiro select seria entre 01-01-2011 e 05-01-2011 pro tipo de declaração 1.

Entretanto não houve declaração no dia 02-01-2011

já o mesmo select com tipo de declaração 2 todos os dias houve declaração.

 

Ai na hora da apresentação dos dados meu grid ficaria errado pois o retorno seria

 

data                tipo declaracao 01          tipo 2
01-01-2011              1000                       500     
02-01-2011               2000                      700

Só que na realidade o valor do tipo 2000 seria do dia 3 pois do 2 não houve declaração para este tipo de declaração

 

 

Outra dúvida é que como farei para que apareça as datas mesmo que naquela data não houve declarações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz uma linha de CASE para cada condição.

use uma função como a GREATEST para obter o maior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz uma linha de CASE para cada condição.

use uma função como a GREATEST para obter o maior.

 

 

AAHHH!!! agora eu vi seu código direito, com o case você criou as colunas na tabela...valeu :)

era isso mesmo que precisava...

Agora só mais uma coisa....

 

tem como eu retornar a data mesmo que não haja declarações para ela, com ela dentro do intervalo lógico.

 

CREATE Proc [dbo].[Proc_Itens_Declaracao_Select] (
  @Param_data_inicial Date,
  @Param_data_final Date,
  @Param_cod_loja Int,
  @Param_cod_tipo_declaracao01 Int,
  @Param_cod_tipo_declaracao02 Int,
  @Param_cod_tipo_declaracao03 Int) 
AS

SELECT Loja.cod_loja, Declaracao.data_declaracao,  
SUM( (case when Declaracao.cod_tipo_declaracao in (1) then Itens_Declaracao.valor else 0 end)) valor1, 
SUM( (case when Declaracao.cod_tipo_declaracao in (2) then Itens_Declaracao.valor else 0 end)) valor2,
SUM( (case when Declaracao.cod_tipo_declaracao in (3) then Itens_Declaracao.valor else 0 end)) valor3, 
SUM( (case when Declaracao.cod_tipo_declaracao in (4) then Itens_Declaracao.valor else 0 end)) valor4

FROM Itens_Declaracao 
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao 
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja 
WHERE Declaracao.data_declaracao  BETWEEN ('2011-01-01') AND ('2011-12-31') 
AND Declaracao.cod_loja = 1020 
AND Declaracao.cod_tipo_declaracao in (1,2,3,4) 
GROUP BY Declaracao.data_declaracao, Loja.cod_loja


RETURN

 

Ta quase pronto, para finalizar mesmo só preciso de mais uma coluna que seria o maior por dia.

Compartilhar este post


Link para o post
Compartilhar em outros sites
tem como eu retornar a data mesmo que não haja declarações para ela, com ela dentro do intervalo lógico.

 

faz um union "fajuto" com uma tabela qq somando 1 a uma data de base

 

SELECT Loja.cod_loja, Declaracao.data_declaracao,  
SUM( (case when Declaracao.cod_tipo_declaracao in (1) then Itens_Declaracao.valor else 0 end)) valor1, 
...
GROUP BY Declaracao.data_declaracao, Loja.cod_loja
UNION
select '01-10-2011' + rownum data,0 valor1,0 valor2,0 valor3
from tabela
where rownum <= (select count(*)
                from <query de cima>)

 

uma coluna que seria o maior por dia.

 

post #8

 

---

rownum é uma coluna virtual do Oracle que dá o número da linha do result set.

somar 1 a uma data no Oracle acresta um dia a mesma.

não sei o equivalente em Sql Server

---

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi...VOu ver se acho no sql server

 

mais quanto a parte do greatest tenho uma dúvida...

 

EU criei a função, que ficou assim

 

USE [AUDITORIA]
GO
/****** Object:  UserDefinedFunction [dbo].[GREATEST]    Script Date: 11/01/2011 11:49:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Equivalent to the ORACLE function "GREATEST"
--
ALTER  function [dbo].[GREATEST](@valor1 SQL_VARIANT, @valor2 SQL_VARIANT, @valor3 SQL_VARIANT)
returns SQL_VARIANT
as
begin
if (@valor1 > @valor2 )
  if (@valor1  > @valor3)
begin
return (@valor1);
end
else
  if (@valor2 > @valor1)
   if (@valor2 > @valor3)
begin
return (@valor2);
end
else
if (@valor3 > @valor2)
 if (@valor3 > @valor1)
 begin
 return (@valor3);
 end
return null;
end

 

tentei utilizar dessa forma mais não consegui:

 

USE [AUDITORIA]
GO
/****** Object:  StoredProcedure [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao]    Script Date: 11/01/2011 11:43:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Proc [dbo].[Proc_Itens_Declaracao_RelatorioDeclaracao] (
  @Param_data_inicial Date,
  @Param_data_final Date,
  @Param_cod_loja Int,
  @Param_cod_tipo_declaracao01 Int ,
  @Param_cod_tipo_declaracao02 Int,
  @Param_cod_tipo_declaracao03 Int) 
AS

SELECT Loja.cod_loja, Declaracao.data_declaracao,
SUM( (case when Declaracao.cod_tipo_declaracao in ( @Param_cod_tipo_declaracao01) then Itens_Declaracao.valor else 0 end)) valor1, 
SUM( (case when Declaracao.cod_tipo_declaracao in ( @Param_cod_tipo_declaracao02) then Itens_Declaracao.valor else 0 end)) valor2,
SUM( (case when Declaracao.cod_tipo_declaracao in ( @Param_cod_tipo_declaracao03) then Itens_Declaracao.valor else 0 end)) valor3, 

select (dbo.GREATEST(valor1, valor2,valor3)

FROM Itens_Declaracao 
INNER JOIN Declaracao ON Declaracao.cod_declaracao = Itens_Declaracao.cod_declaracao 
INNER JOIN Loja ON Loja.cod_loja = Declaracao.cod_loja 
WHERE Declaracao.data_declaracao  BETWEEN ('@Param_data_inicial') AND ('@Param_data_final') 
AND Declaracao.cod_loja = @Param_cod_loja 
AND Declaracao.cod_tipo_declaracao in (@Param_cod_tipo_declaracao01,@Param_cod_tipo_declaracao02,
@Param_cod_tipo_declaracao03) 
GROUP BY Declaracao.data_declaracao, Loja.cod_loja




RETURN

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que vai ter de ser :

 

GREATEST(sum(case when...,sum(case when...,sum(case when...)

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.