Pergunta

Eu tenho duas mesas no meu banco de dados, uma para In e um para Out. Eles têm duas colunas, Quantity e Price. Como posso escrever um SQL-Query que seleciona o preço correto?

No exemplo: se eu tiver 3 itens dentro para 75 e depois 3 itens dentro para 80. Então eu tenho dois Fora para 75 e o terceiro Fora deve ser para 75 (x) e o quarto Fora deve ser para 80 (y).

Como posso escrever a consulta de preços para x e y? Eles devem usar o preço da terceira e para a frente. Em exemplo, existe alguma maneira de selecionar a terceira linha no In-tabela? Não posso usar o Auto_increment como identificador para o IE "terceira" linha, porque as tabelas também conterão post para outros itens. As linhas não serão excluídas, elas serão salvas por razões de prestação de contas.

SELECT Price FROM In WHERE ...?

NOVO Design de banco de dados:

+----+
| In |
+----+------+-------+
| Supply_ID | Price |
+-----------+-------+
|     1     |  75   |
|     1     |  75   |
|     1     |  75   |
|     2     |  80   |
|     2     |  80   |
+-----------+-------+
+-----+
| Out |
+-----+-------+-------+
| Delivery_ID | Price |
+-------------+-------+
|      1      |  75   |
|      1      |  75   |
|      2      |   X   | <- ?
|      3      |   Y   | <- ?
+-------------+-------+

VELHO Design de banco de dados:

+----+
| In |
+----+------+----------+-------+
| Supply_ID | Quantity | Price |
+-----------+----------+-------+
|     1     |  3       |  75   |
|     2     |  3       |  80   |
+-----------+----------+-------+

+-----+
| Out |
+-----+-------+----------+-------+
| Delivery_ID | Quantity | Price |
+-------------+----------+-------+
|      1      |  2       |  75   |
|      2      |  1       |   X   | <- ?
|      3      |  1       |   Y   | <- ?
+-------------+----------+-------+
Foi útil?

Solução

Lendo os comentários, você diz que está disposto a adicionar um campo de incremento automático ou data para conhecer a posição correta de cada linha. Depois de adicionar isso, eu recomendaria adicionar mais uma linha à tabela IN chamada processada, que é definida automaticamente como falsa quando a linha for adicionada à tabela. Quaisquer linhas que foram copiadas para sair já tenham seu processo processado definido como true.

+----+
| In |
+-----------+-----------+-------+-----------+
| AUtoId    | Supply_ID | Price | Processed |
+-----------+-----------+-------+-----------+
|     1     |     1     |  75   |     1     |
|     2     |     1     |  75   |     1     |
|     3     |     1     |  75   |     0     |
|     4     |     2     |  80   |     0     |
|     5     |     2     |  80   |     0     |
+-----------+-----------+-------+---------- +

Então, para encontrar o próximo item para se mover para sair, você pode fazer

SELECT TOP 1 Supply_ID, Price 
FROM In WHERE Processed = 0
ORDER BY [Your Auto Increment Field or Date]

Depois que a linha é movida para sair, você apenas atualiza o campo processado dessa linha para True.

Outras dicas

Não consigo ver uma consulta simples que ajudaria aqui. Para simular um FIFO no SQL, eu procuraria três mesas, operação, saída e FIFO. A operação é efetivamente um registro das transações e a tabela FIFO é o estado FIFO e é as respostas do FIFO.

Você atualizaria atual com as operações (adicionando e removendo itens) à medida que eles entram na tabela de operações e procesam solicitações de itens na tabela de saída, diminuindo os valores no FIFO e quando necessário remover os registros da tabela FIFO.

Mesmo assim, não vejo uma consulta simplesmente para processar a coisa toda, pois é necessário consultar o primeiro registro para ver se há quantidade suficiente para cada operação, atualização desse registro adequadamente e consulta de registros adicionais em que a operação não pode ser realizada. Meu nível de habilidade SQL não me leva a uma solução simples para isso, constitui lógica de negócios para mim e é levantada nessa camada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top