Get older value from another table

Asked

Viewed 210 times

1

need to create a query that returns the oldest stock of each product within a specified period:

Tabela Produtos:

ID DESCRICAO
1  TOMATE
2  ABACAXI

Tabela Estoque:

DATA       HORA     PRODUTO  ESTOQUE 
01/01/2015 09:01:00 1        8
01/01/2015 10:05:15 1        7
01/01/2015 11:00:20 2        15

Should return something like:

Produto Estoque
1       8
2       15

I tried to create something like this:

select e.produto, s1.estoque from estoque e
  left outer join
  (select produto, e1.estoque
   Min(CAST(Right('0' + Cast(DayOfMonth(e1.data) as sql_varchar),2) + '/' + 
            Right('0' + Cast(Month(e1.data) as sql_varchar),2) + '/' + 
            Right('00' + Cast(Year(e1.data) as sql_varchar),4) + ' ' + 
            Trim(e1.Hora) AS SQL_TIMESTAMP)) as tempo
   from estmovd e1
   where e1.data between '10/01/2015' and '10/10/2015') s1 on s1.produto = e1.produto 
where e.data between '10/01/2015' and '10/10/2015'

But without success. Does anyone have any tips to help me?

Thank you

  • Which database?

  • I am using the FREE version of ADS (Advantage Database Server), version 9.1

  • So the example I answered below uses SQL Server 2012, try to use it in your database. I believe it works! @Fabio

2 answers

1

Thank you all for your help. I managed to solve it in the following way:

select e.produto, e.saldo from estoque e
where CAST(Right('00' + Cast(Year(e.data) as sql_varchar),4) + '-' +
            Right('0' + Cast(Month(e.data) as sql_varchar),2) + '-' +
            Right('0' + Cast(DayOfMonth(e.data) as sql_varchar),2) + ' ' + 
            Trim(e.Hora) AS SQL_TIMESTAMP ) =
(
    SELECT  MIN(CAST(Right('00' + Cast(Year(e.data) as sql_varchar),4) + '-' +
            Right('0' + Cast(Month(e.data) as sql_varchar),2) + '-' +
            Right('0' + Cast(DayOfMonth(e.data) as sql_varchar),2) + ' ' + 
            Trim(e.Hora) AS SQL_TIMESTAMP))
    FROM estoque e2
    WHERE e2.Produto = e.Produto
)           
  • Good Fabio, I recommend even you use datetime fields together, or it is incredibly complicated to join all hehe

0

Opa,

recommend you to use a column DATAHORA together with DATA, TIME separated, in which case the test below works as you want:

CREATE TABLE #Produtos
(
    DATAHORA DateTime,
    PRODUTO int,
    ESTOQUE int
)

INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 08:01:00', 1, 8)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 09:05:15', 1, 7)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 11:00:20', 2, 15)
INSERT INTO #Produtos (DATAHORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015 10:00:15', 2, 5)

SELECT p.Produto, p.Estoque
FROM #Produtos p
WHERE p.DataHora =
(
    SELECT MIN(p2.DataHora)
    FROM #Produtos p2
    WHERE p2.Produto = p.Produto
)

DROP TABLE #Produtos

The example below uses separate DATE and TIME as in your table:

CREATE TABLE #Produtos
(
    DATA DateTime,
    HORA DateTime,
    PRODUTO int,
    ESTOQUE int
)

INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','08:01:00', 1, 8)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','09:05:15', 1, 7)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','11:00:20', 2, 15)
INSERT INTO #Produtos (DATA, HORA, PRODUTO, ESTOQUE) VALUES ('01-01-2015','10:00:15', 2, 5)

SELECT p.Produto, p.Estoque
FROM #Produtos p
WHERE (cast(p.Data as datetime) + cast(p.Hora as datetime)) =
(
    SELECT MIN(cast(p2.Data as datetime) + cast(p2.Hora as datetime))
    FROM #Produtos p2
    WHERE p2.Produto = p.Produto
)

DROP TABLE #Produtos
  • 1

    Thanks for the help. I got the expected result by doing it this way:

Browser other questions tagged

You are not signed in. Login or sign up in order to post.