Ir para conteúdo

Arquivado

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

Motar

GROUP BY para o primeiro registro

Recommended Posts

Viva

Tenho uma tabela de clientes que tem o campo CodCliente, depois tenho outra tabela de ComprasPorCliente.

A tabela ComprasPorCliente tem o campo Estado e DataEstado

 

Pretendo criar uma View que me mostre para cada cliente a compra no estado mais baixo e a data desse estado mais baixa.

Exemplo:

CodCliente = 1

ComprasPorCliente

CodCliente Estado DataEstado

1 Estado1 31-03-2015

1 Estado1 01-03-2015

1 Estado2 02-02-2015

1 Estado3 31-01-2015

2 Estado2 02-02-2015

2 Estado3 31-01-2015

 

O resultado da view deveria ser:

CodCliente Estado DataEstado

1 Estado1 01-03-2015

2 Estado2 02-02-2015

 

Fazendo uma view com ordenações mostra em primeiro lugar para cada cliente a informação pretendida, mas mostra vários registos para cada cliente.

Tem como fazer um GROUP BY para o primeiro registo de cada cliente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com este comando (Group by com MAX(data) mostra a data máxima independente do estado certo?

(Não é isso que pretendo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 


Pretendo criar uma View que me mostre para cada cliente a compra no estado mais baixo e a data desse estado mais baixa.

No seu resultado esperado tem algo errado, pois a menor data do CodCliente 1 e do CodCliente 2 seria 31-01-2015

 

O que pede pode ser feito desta maneira:

 

declare @table table (CodCliente   int, Estado varchar(100), DataEstado varchar(10))
 
insert into @table values (1,'Estado1','31-03-2015')
insert into @table values (1,'Estado1','01-03-2015')
insert into @table values (1,'Estado2','02-02-2015')
insert into @table values (1,'Estado3','31-01-2015')
insert into @table values (2,'Estado2','02-02-2015')
insert into @table values (2,'Estado3','31-01-2015')
 
 
select a.* 
from (
select CodCliente
-- , Estado
, MIN( CONVERT(datetime, DataEstado,103))  as Data
from @table
GROUP BY CodCliente
)g inner join @table a on g.CodCliente = a.CodCliente
and g.Data = CONVERT(datetime, a.DataEstado,103)
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

No seu resultado esperado tem algo errado, pois a menor data do CodCliente 1 e do CodCliente 2 seria 31-01-2015

 

O que pede pode ser feito desta maneira:

declare @table table (CodCliente   int, Estado varchar(100), DataEstado varchar(10))
 
insert into @table values (1,'Estado1','31-03-2015')
insert into @table values (1,'Estado1','01-03-2015')
insert into @table values (1,'Estado2','02-02-2015')
insert into @table values (1,'Estado3','31-01-2015')
insert into @table values (2,'Estado2','02-02-2015')
insert into @table values (2,'Estado3','31-01-2015')
 
 
select a.* 
from (
select CodCliente
-- , Estado
, MIN( CONVERT(datetime, DataEstado,103))  as Data
from @table
GROUP BY CodCliente
)g inner join @table a on g.CodCliente = a.CodCliente
and g.Data = CONVERT(datetime, a.DataEstado,103)
 

Não seria 31-01-2015 porque eu pretendo selecionar a data menor do estado menor, por exemplo o estado menor do cliente 1 é Estado1 e dentro do estado 1 a data menor é 01-03-2015, espero ter-me feito entender do que pretendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok.

Parqa calculo de menor ou maior temos que ter valores numericos, pois valores como texto fica inviavel fazer este tipo de pesquisa. Tem algum campo/tabela que indique qual seria este valor??


Por exemplo:

 

 

declare @table table (CodCliente   int, Estado varchar(100), DataEstado varchar(10))
 
 -- SUPONDO QUE ESTADO1 = 1, ESTADO2 = 2 E ASSIM POR DIANTE
insert into @table values (1,'1','31-03-2015')
insert into @table values (1,'1','01-03-2015')
insert into @table values (1,'2','02-02-2015')
insert into @table values (1,'3','31-01-2015')
insert into @table values (2,'2','02-02-2015')
insert into @table values (2,'3','31-01-2015')
 
-- MENOR ESTADO POR CLIENTE
 
select est.CodCliente, Data.Estado, Data.DataEstado
from 
(
select CodCliente
, min(Estado) as min_estado
from @table
GROUP BY CodCliente
) est 
inner join (select CodCliente, Estado, min(DataEstado) as DataEstado  from @table Group by CodCliente, Estado) Data
on est.CodCliente = Data.CodCliente
and est.min_estado = Data.Estado
 

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.