SQL - prosze o sprawdzenie skladni zapytania

0

Witam,

Mam mały problem z wygenerowaniem raportu z bazy danych (przykład w załączeniu).
Dane są pobierane z 3 różnych tabel.
Pola 'dbo.InvoiceMismatchQuestions.Status' i 'dbo.InvoiceHistory.NewStatus' mają różne wartości dla tego samego pola 'dbo.Invoices.InvoiceNo' i dlatego w raporcie jest tyle wierszy ile roznych kombinacji tych pól.

Ja potrzebuje wyświetlić dane tylko dla ostatniego numeru sekwencyjnego dla pola ‘New Status’ (dla tego o największej wartości numerycznej) i dla najstarszej daty tak żeby w raporcie byla tylko faktyczna liczba bledow faktury – w moim przypadku powinny to byc tylko 2 wiersze (te oznaczone na zielono).

Próbowałem uzyc funkcji WHERE ale za kazdym razem wyrzuca mi blad skladni.

Ponizsze zapytanie generuje mi raport jak w zalaczonym jpg, a ja potrzebuje kod, ktory wygeneruje tylko te 2 linie oznaczone na zielono


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.InvoiceMismatchQuestions.QuestionDate, 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.InvoiceNo = 1019833

ORDER BY InvoiceNo,NewStatus

Dziękuję bardzo za pomoc.
Mariusz

0

Nie wiem co to za baza ale dbo wskazywałoby na MSSQL. Jeżeli tak ja bym to nieco uprościł:

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.InvoiceMismatchQuestions.QuestionDate, 
            dbo.InvoiceHistory.NewStatus 
   FROM dbo.Invoices, dbo.InvoiceMismatchQuestions, dbo.InvoiceHistory   
 WHERE dbo.Invoices.InvoiceNo = 1019833
     AND dbo.Invoices.InvoiceGUID = dbo.InvoiceMismatchQuestions.InvoiceGUID
     AND dbo.InvoiceMismatchQuestions.InvoiceGUID = dbo.InvoiceHistory.InvoiceGUID
 ORDER BY dbo.Invoices.InvoiceNo, dbo.InvoiceHistory.NewStatus

Natomiast bez podania jaki wyjątek ci rzuca zapytanie i bez tabel (a nie chce mi się ich tworzyć i uzupełniać danymi) mogę jedynie dywagować co Ci się sypie.

0

Dzięki woolfik.

Poniższy kod działa, ale to nie do końca to czego potrzebuje.
W poniższym przykładzie podałem tylko przykładowy numer id faktury 1019833, ale w finalnym raporcie będzie tych faktur ok. 200. Chciałem żeby ktoś mi pomógł z konstrukcją funkcji warunkowej WHERE dla jednego przypadku 1019833, a ja już sam bym sobie go uogólnił na wszystkie faktury.

Ogólnie rzec biorąc – raz w tygodniu muszę z systemu wygenerować listę niezaksięgowanych faktur, czyli takich, które są blokowane przez jakiegoś użytkownika/użytkowników.

Po wygenerowaniu kodu, tego którego użyłem w pierwszym poście, raport pokazuje mi jedną fakturę kilka razy w różnych wierszach – tych linii jest tak dużo bo jedna faktura ma np. kilka komentarzy wprowadzonych przez różnych użytkowników. Dodatkowo jedna faktura może być połączona z kilkoma różnymi numerami zamówień.
Chciałbym żeby w raporcie dla każdej faktury wygenerować tylko ostatni komentarz (największa wartość numeryczna dla pola New.Status) i najnowszą datę (pole QuestionDate).

Czy dałoby się to zrobić tylko dla tej jednej faktury 1019833. Ta konkretna faktura jest powiązana z dwoma różnymi zamówieniami (ma dwa różne komentarze) i dlatego w raporcie (dla tej konkretnej faktury) powinny pozostać 2 wiersze – te zaznaczone na zielono w jednym z załączonych JPG.

Czy powyższy opis cokolwiek pomógł?

Dziękuje bardzo,
Mariusz

0

Widzisz chętnie bym Ci pomógł ale bez bazy jest dość trudno ... Z tego co piszesz (i z tego co zrozumiałem) masz tabele faktur (tam jest ten jeden konkretny rekord -dbo.Invoices) do tego tabelę z zamówieniami (tam są dwa rekordy - dbo.InvoiceMismatchQuestions) i tabelę gdzie jest wiele rekordów (dbo.InvoiceHistory). Finalnie chcesz dla tej konkretnej faktury wyciągnąć interesujące cię rekordy z dbo.InvoiceMismatchQuestions dorzucając informacje z innych tabel. Żaden problem idzie to zrobić na kilka sposóbów. Po pierwsze musisz użyć funkcji DISTINCT (pozwala uniknąć w wynikach zdublowanych rekordów - to się dodaje w SELECT). Po drugie jeżeli wyciągamy dane z wielorekordowej tabeli to musisz zawęzić zakres zwracanych danych np poprzez GROUP BY. Z kolei użycie GROUP BY (po WHERE) wymusi na tobie dodanie np funkcji HEVING aby zwrócić rekord z max(NEW.STATUS) i max(QuestionDate). Oczywiście można to zrobić jeszcze inaczej np poprzez union i dwa niezależne selecty na max daty i statusu oraz rownum = 1. Możesz użyć podzapytania w postaci with itd ... Tak jak pisałem w pierwszym poście ciężko coś powiedzieć nie znając nawet dystrybucji bazy danych - bo nie napisałeś czy to PostgreSQL, Oracle, MySQL, MSSQL czy coś innego, a ja się tylko domyślam, że to MSSQL. Jeżeli Ci na tym mocno zależy to zestaw połączenie zdalne do bazy i może ktoś będzie w stanie Ci takiego selecta zrobić za free (lub w innej części forum jako usługa płatna).

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