tenho as tabelas:
- Faturas ( VendorID, InvoiceDate, InvoiceNumber, InvoiceTotal,...),
- Fornecedores (VendorName, VendorID,....)
Estou tentando obter uma lista das primeiras faturas de cada fornecedor, junto com VendorName
, InvoiceNumber
, InvoiceDate
, InvoiceTotal
(para a data mais antiga).
Aqui está o que eu tenho:
SELECT VendorName, InvoiceNumber, InvoiceDate, InvoiceTotal
FROM Vendors V JOIN Invoices I ON V.VendorID=I.VendorID
WHERE InvoiceDate <= ( SELECT Min(InvoiceDate)
FROM Invoices
JOIN Vendors ON V.VendorID=Vendors.VendorID )
GROUP BY VendorName, InvoiceNumber, InvoiceDate, InvoiceTotal
O problema é que estou recebendo apenas uma fatura, que é a mais antiga de todas as faturas, não a mais antiga por estado. O que está acontecendo?
Parece que você não tem InvoiceState em nenhum lugar da sua consulta.
Aqui está com uma formatação um pouco melhor ( PRE-COLUMN COMMA MASTERRACE!! )
Adicioná-lo (InvoiceState) ao seu SELECT e GROUP BY adicionaria esse nível de detalhe. Presumo que você precise adicioná-lo como sua primeira coluna (antes de VendorName).
Editar: olhando mais adiante, parece que você também precisa disso em sua subconsulta.
Ao enviar um pedido, você pode obter suas primeiras faturas para cada fornecedor
Com base em sua amostra, suponho que você deseja uma linha por fornecedor e não por estado (que não aparece em nenhum lugar do seu exemplo;)).
O Cross Apply Top 1 é meu método preferido ao lidar com essa necessidade. Isso será otimizado como um INNER JOIN pelo mecanismo.
Também muito mais legível do que espremer uma subconsulta na cláusula where, que tem uma grande chance de precisar de uma avaliação para cada linha.