Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

acabrita

SELECT MAX

Mensagens Recomendadas

acabrita

Boa noite a todos,

Não consigo fazer uma query em que me mostre na mesma linha as datas e os valores das três ultimas compras de cada cliente, apenas nos documentos do tipo (tipoDoc) 15, Alguem me pode ajudar? Muito Obrigado.

André Cabrita

Resultados Pretendidos

Nº_cliente  Nome        ultima    ValorUltima          penultima    ValorPenultima        antepenultima      ValorAntPen

1                ABC    20-01-2011        50                  15-01-2011              90                  10-01-2011          120

2                DEF    31-01-2011        33                  22-01-2011            33                  12-01-2011            25

3                GHI    22-01-2011      22                    20-01-2011            45                    20-01-2011            45

4....

Dados

N_Cliente Data_Compra Nome Valor TipoDoc

1                01-01-2011  ABC    100    15

1                10-01-2011  ABC    120    15

1                15-01-2011  ABC    90      15

1                20-01-2011  ABC    50      15

2                02-02-2011  DEF    15      15

2                12-01-2011  DEF    25    15

2                22-01-2011  DEF    55    15

2                31-01-2011  DEF    33    15

3                20-01-2011  GHI    45    15

3                22-01-2011  GHI    22    15

4....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acabrita

Bom dia,

Com o Top (3) como consigo garantir que sejam os mais recentes? Como consigo colocar na mesma linha os 3 ultimos?. Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Se queres garantir os mais recentes ordenas pela data.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Caça

Se ordenares de forma ascendente consegues obter os últimos três registos mas tudo na mesma linha acho que não é possível


Pedro Martins

Não respondo a duvidas por PM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acabrita

Bom dia,

Com o  TOP apenas mostra o 3 resgistos globais, não consigo que me mostre as 3 ultimas compras de cada cliente. Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acabrita

Bom dia Caça,

Não consigo que o TOP funcione, tem que ser a solução do MAX, para poder no mesmo resultado ter o resumo de todos os clientes e o resumo das ultimas 3 compras. Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

Se queres as três últimas compras na mesma linha isso é possível, no entanto "cheira-me a borrada" de arquitectura...

No dia em que necesitarem das 5 primeiras alguém vai ter que alterar uma porrada de código em vários sitios, certo?

Mas se queres mesmo obter as três primeiras na mesma linha consegues fazer isso obtendo os três primeiros registos e fazendo left joins entre a tabela de dados e o número do registo.

Não tenho SQL Server por aqui, mas é algo do tipo

select compra1.*, compra2.*, compra3.*
from (
   select ROW_NUMBER() OVER(ORDER BY N_CLIENTE, Data_Compra DESC) AS 'LINHA', * from dados
   where LINHA <=3) as compras
inner join (select ROW_NUMBER() OVER(ORDER BY N_CLIENTE, Data_Compra DESC) AS 'LINHA', * from dados
      where LINHA = 1) as compra1 
   on compra.n_cliente = compra1.n_cliente
   and compra.linha= compra1.linha
left join (select ROW_NUMBER() OVER(ORDER BY N_CLIENTE, Data_Compra DESC) AS 'LINHA', * from dados
      where LINHA = 2) as compra2 
   on compra.n_cliente = compra2.n_cliente
   and compra.linha= compra2.linha
left join (select ROW_NUMBER() OVER(ORDER BY N_CLIENTE, Data_Compra DESC) AS 'LINHA', * from dados
     where LINHA = 3) as compra3 
   on compra.n_cliente = compra3.n_cliente
   and compra.linha= compra3.linha

Vê mais info aqui: http://msdn.microsoft.com/en-us/library/ms186734.aspx

É bem possível que isso possa ser reescrito de outra forma mais eficiente, mas deixo esse exercício para ti  :cheesygrin:...

PS: tens um "erro" na tua tabela de dados. Não está na terceira forma normal, pelo que a menos que o número e o nome do cliente se encontrem repetidos por questões de performance (o que sinceramente duvido), esse modelo não está correcto.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acabrita

Solução que me enviaram para partilhar, funciona na perfeição, Abraço e Obrigado a todos.

;with cte as (select ClientID,[Name],[Date],[Value], row_number() over (partition by ClientIDorder by [Date] Desc) as Row from [Data] where typeDoc = 15)

select ClientID,[Name],

max(case when Row = 1 then [Date] end) as [1Last],

max(case when Row = 1 then [Value] end) as [V1Last],

max(case when Row = 2 then [Date] end) as [2Last],

max(case when Row = 2 then [Value] end) as [V2Last],

max(case when Row = 3 then [Date] end) as [3Last],

max(case when Row = 3 then [Value] end) as [V3Last]

from cte GROUP BY ClientID, [Name]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.