Mój prawie-pierwszy SELECT i od razu takie coś… MS SQL. Proszę nie dławić się ze śmiechu [zbyt głośno], to poważna rzecz jest.
SELECT
Str(Year(sesje.RCS_TS_Start), 4) As rok,
Replace(Str(Month(sesje.RCS_TS_Start), 2), ' ', '0') AS miesiac,
bazy.Baz_Nazwa AS klient,
Count(nag.TrN_RazemNetto) AS ile_razy,
Sum(DateDiff(hour, sesje.RCS_TS_Start, sesje.RCS_TS_Stop)) AS godz,
Sum(nag.TrN_RazemNetto) AS netto
FROM CDN.RCSesje sesje INNER JOIN
CDN.Operatorzy oper On oper.Ope_OpeID = sesje.RCS_OpeId
INNER JOIN
(CDN.Bazy bazy
INNER JOIN
( [SERVER\OPTIMA].FABRYKA.CDN.Kontrahenci kth
INNER JOIN [SERVER\OPTIMA].FABRYKA.CDN.TraNag nag ON kth.Knt_KntId =
nag.TrN_OdbID) ON bazy.Baz_GUID = kth.Knt_BazaBR_GUID )
ON bazy.Baz_BazID = sesje.RCS_BazId AND Month(sesje.RCS_TS_Start) =
Month(nag.TrN_DataDok) AND Year(sesje.RCS_TS_Start) = Year(nag.TrN_DataDok)
WHERE bazy.Baz_Nazwa = 'Jola'
GROUP BY
Str(Year(sesje.RCS_TS_Start), 4),
Replace(Str(Month(sesje.RCS_TS_Start), 2),' ', '0'),
bazy.Baz_Nazwa
ORDER BY
Str(Year(sesje.RCS_TS_Start), 4), Replace(Str(Month(sesje.RCS_TS_Start), 2),' ', '0')
Dwa tematy:
- Dla klienta ‚Jola’ w tabeli ‚sesje’ mam w jednym przypadku 4 zapisy i tylko jeden zapis w tabeli nag. SELECT w powyższym kształcie znajduje grzecznie ten zapis dla każdego wyszukanego wiersza w tabeli ‚sesje’, skutkiem czego agregat sumuje mi wielkości z pola TrN_RazemNetto do kwoty czterokrotnie większej, niż rzeczywista.
- Z kolei w innym przypadku mam bliżej nieokreśloną ilość kwalifikowalnych wierszy w tabeli ‚sesje’ i dwa spełniające warunek wiersze w tabeli ‚nag’. Sumuje mi tylko jeden. Złączenia wydają się być poprawne pod kątem business logic.
Co robię źle, kochany pamiętniczku?