SQL - trudności z zapytaniem

0

Witam,

Mam mały problem z wygenerowaniem raportu z bazy danych (przykład w załączeniu).
Dane są pobierane z 4 różnych tabel.
Pola 'dbo.InvoiceMismatch.Comment' i 'dbo.InvoiceQuestion.SequenceNo' mają różne wartości dla tego samego pola 'dbo.Invoice.InvoiceNo' i dlatego w raporcie jest tyle wierszy ile komentarzy dla poszczególnej faktury.

Ja potrzebuje wyświetlić dane tylko dla ostatniego numeru sekwencyjnego (dla tego o największej wartości numerycznej) tak żeby każda faktura była wyświetlana tylko raz w raporcie z ostatnim (najświeższym) wpisanym komentarzem.

Próbowałem różnych zapytań, ale za każdym razem wyrzucało mi błąd.

Dziękuję bardzo za pomoc.
Mariusz

0

Mariusz użyj podzapytania skorelowanego.

Tworzysz swoje zapytanie które zwraca Ci to co dostajesz teraz.Na końcu musisz dodać warunek :

where dbo.invoiceQuestion.sequenceNO=(
Select max(dbo.invoiceQuestion.sequenceNO)
from dbo.invoiceQuestion
where   dbo.invoiceQuestion.invoiceNO= <<<<< "nazwa tabeli z górnego zapytania z której bierzesz invoiceNO".invoiceNO
)

Nie podałeś definicji tabel, dlatego taka ogólna odpowiedź.W czasie gdy zapytanie będzie szło wybierze Ci tylko ten wiersz gdzie dbo.invoiceQuestion.sequenceNO będzie największe dla obecnie "eksplorowanej" faktury.

0

przy założeniu, że te 3 tabele pomiędzy sobą można powiązać po InvoiceNo oraz że najświeższy komentarz można rozpoznać po największym polu CommentID, to zapytanie powinno wyglądać mniej-więcej tak:

select i.InvoiceNo, im.Mismatch_Status, im.Comment, iq.SequenceNo
from Invoice i left join (select InvoiceNo, max(SequenceNo) SequenceNo from InvoiceQuestion group by InvoiceNo) iq on (i.InvoiceNo=iq.InvoiceNo)
left join (select InvoiceNo, max(CommentID) CommentID from InvoiceMismatch group by InvoiceNo) imm on (i.InvoiceNo=imm.InvoiceNo)
left join InvoiceMismatch im on (i.InvoiceNo=im.InvoiceNo and imm.CommentID=im.CommentID)
order by i.InvoiceNo
0

Dziekuje bardzo za pomoc - dopiero zaczynam sie bawic SQLem.

Ponizej jest kod, ktory napisalem, a w zalaczeniu graficzne polaczenie tabel i pola uzywane w raporcie.

Ponizszy kod dziala poprawnie ale dla statusu ‘Tentative Match' raport wyrzuca mi duza liczbe wierszy bo dla jednej faktury jest wiele komentarzy (w zaleznosci od upodoban uzytkownika).
Mam tutaj problem z wywolaniem tylko najstarszego komentarza (pole ‘NewStatus’ - wartosc numeryczna).
Nawet gdy wywolalem najkwieksza wartosc numeryczna dla kazdej faktury to i tak w raporcie pokazuja mi sie ciagle zduplikowane wiersze z roznymi komentarzami :(

Z gory dzieki za pomoc,
Mariusz

SELECT dbo.Invoices.InvoiceNo, dbo.Invoices.DocType, dbo.Invoices.CreatedBy, dbo.Invoices.Currency, dbo.Invoices.SupplierInvoiceDate, dbo.Invoices.SupplierInvoiceNo, dbo.Invoices.TotalNetValue, dbo.Invoices.InvoiceStatus, dbo.Invoices.InvoiceSupplierCode, dbo.Invoices.InvoiceSupplierTitle, dbo.InvoiceMismatchQuestions.Status, dbo.InvoiceMismatchQuestions.Description, dbo.InvoiceMismatchQuestions.QuestionText, dbo.InvoiceHistory.NewStatus

FROM (dbo.Invoices LEFT JOIN dbo.InvoiceMismatchQuestions ON dbo.Invoices.InvoiceGUID = dbo.InvoiceMismatchQuestions.InvoiceGUID) LEFT JOIN dbo.InvoiceHistory ON dbo.InvoiceMismatchQuestions.InvoiceGUID = dbo.InvoiceHistory.InvoiceGUID

WHERE dbo.Invoices.InvoiceStatus Like '1 : Registered' OR dbo.Invoices.InvoiceStatus Like '3 : Tentative Match'

1 użytkowników online, w tym zalogowanych: 0, gości: 1