Zauważ, że przy takim join-ie, jeżeli dany towar "posiada" w tabeli zasoby, więcej niż jeden rekord (m), to jest on dla każdych n elementów z Traelem zwracany m razy - stąd błędy. W miarę możliwości nie używaj pól takich jak twr_nazwa do grupowania, bo nie jest to pole unikalne w tabeli i przez to możesz otrzymywać błędne obliczenia. Zamiast tego w klauzuli GROUP BY używaj np twr_gidnumer, ewentualnie twr_kod. Niepotrzebnie też robisz grupowanie po twz_ilmag - w ten sposób dodatkowo rozbijasz wiersze ze względu na ilość i jeszcze robisz sumowanie tej ilości. Czyli mając 2 rekordy po 10 sztuk i jeden rekord z ilością 15 sztuk, zapytanie zwróci ci 2 pozycje - jedną na 20, a drugą na 15 sztuk. Grupowanie zrób w ten sposób:
GROUP BY
TGD2.TGD_Kod,
TRE.TRE_TwrNumer,
ZAS.TwZ_MagNumer
Jeżeli chcesz wyciągać pole które jest tekstowe, a nie grupujesz po nim, użyj po prostu funkcji max(), np select max(twr_nazwa) ...
Tak wiem, że mógłbym to napisać i dać Ci gotowca, ale skoro zaczynasz z tym pracować to dużo lepiej będzie jak zrobisz to sam, a ktoś ewentualnie to poprawi. I satysfakcja też większa
EDIT: W kodzie naniosłem poprawkę dla Tre_Twrnumer - gdzieś się tam GID zakradł
Ok poprawiłem grupowanie wg twojej rady dzięki za pomoc niestety ale z powodu braku dokumentacji ciężko mi zrobić bardziej skomplikowane raporty.
Faktem jest iż dopiero poznaje XL i całą jego strukturę i SQL-a więc dzięki za wyrozumiałość.
Odnośnie Joina niestety nie udało mi się tego poprawić ale będę walczył dalej.
Nio muszę przyznać że satysfakcją jest ogromna.
Udało mi się uzyskać to co chciałem.
Ale jeszcze popracuję na tym wykresem.
Dziękuję użytkownikowi "elmiq" za pomoc.
@PAR ?@S20|kod_grupy|Początek kodu grupy:% @? PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT MAG_GIDNumer, MAG_Kod FROM CDN.Magazyny)|Mags|&Magazyn:REG= 1 @? PAR@
@PAR ?@EOL PAR@
@PAR ?@D17|Data_Od|Data &od:{DateClwFirstDay('m')} @? PAR@
@PAR ?@D17|Data_Do|Data &do:{Today()} @? PAR@
@PAR ?@EOL PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag1|&Magazyn 1:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag2|&Magazyn 2:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag3|&Magazyn 3:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag4|&Magazyn 4:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag5|&Magazyn 5:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag6|&Magazyn 6:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag7|&Magazyn 7:REG= @? PAR@
SELECT
1 AS id,
W.KodG AS [Kod grupy],
W.Kod AS [Kod towaru],
sum(CASE WHEN W.Magazyn = ??Mag1 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 1],
sum(CASE WHEN W.Magazyn = ??Mag2 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 2],
sum(CASE WHEN W.Magazyn = ??Mag3 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 3],
sum(CASE WHEN W.Magazyn = ??Mag4 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 4],
sum(CASE WHEN W.Magazyn = ??Mag5 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 5],
sum(CASE WHEN W.Magazyn = ??Mag6 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 6],
sum(CASE WHEN W.Magazyn = ??Mag7 THEN W.Ilosc ELSE 0 END) AS [Ilość na Magazynie 7],
W.Iloscs AS [Ilość Sprzedana]
FROM
(
SELECT
TGD2.TGD_Kod AS KodG,
TWR.Twr_Kod AS Kod,
SUM(ZAS.TwZ_IlSpr) AS Ilosc,
ZAS.TwZ_MagNumer AS Magazyn,
IloscS=(select SUM(Tre_Ilosc) from cdn.traelem INNER JOIN
CDN.TraNag ON Trn_GIDNumer=Tre_GIDNumer AND Trn_GIDTyp=TrE_GIDTyp and tre_twrkod=TWR.Twr_Kod
and TRN_DATA3 >=??Data_Od AND
TRN_DATA3 <=??Data_Do
where TRN_MagZNumer=??Mags)
FROM
CDN.TwrZasoby AS ZAS LEFT OUTER JOIN
CDN.TwrKarty AS TWR ON ZAS.TwZ_TwrNumer = TWR.Twr_GIDNumer INNER JOIN
CDN.TwrGrupyDom AS TGD1 ON Twr_GIDNumer = TGD1.TGD_GIDNumer INNER JOIN
CDN.TwrGrupyDom AS TGD2 ON (TGD1.TGD_GrONumer = TGD2.TGD_GIDNumer)
WHERE
TGD1.TGD_GIDTyp = 16 AND
TGD2.TGD_GIDTyp = -16 AND
TGD2.TGD_Kod LIKE ??kod_grupy + '%' AND
TWR.Twr_Typ = 1 AND
ZAS.TwZ_MagNumer IN (??Mag1, ??Mag2, ??Mag3, ??Mag4, ??Mag5, ??Mag6, ??Mag7)
GROUP BY
TGD2.TGD_Kod,
TWR.Twr_Kod,
ZAS.TwZ_MagNumer
HAVING
SUM(ZAS.TwZ_IlSpr) <> 0
) AS W
GROUP BY
W.KodG, W.Kod, W.Iloscs
ORDER BY
W.KodG, W.Kod
@PAR ?@S20|kod_grupy|Początek kodu grupy:% @? PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT MAG_GIDNumer, MAG_Kod FROM CDN.Magazyny)|Mags|&Magazyn:REG= 1 @? PAR@
@PAR ?@EOL PAR@
@PAR ?@D17|Data_Od|Data &od:{DateClwFirstDay('m')} @? PAR@
@PAR ?@D17|Data_Do|Data &do:{Today()} @? PAR@
@PAR ?@EOL PAR@
@PAR ?@EOL PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag1|&Magazyn 1:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag2|&Magazyn 2:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag3|&Magazyn 3:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag4|&Magazyn 4:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag5|&Magazyn 5:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag6|&Magazyn 6:REG= @? PAR@
@PAR ?@R(SELECT Mag_GIDNumer, Mag_Kod FROM cdn.Magazyny WHERE CDN.Magazyny.Mag_Kod <> 'SKŁAD' AND CDN.Magazyny.Mag_Kod <> 'NIE' order by 2)|Mag7|&Magazyn 7:REG= @? PAR@
SELECT
ID=1,
TGD2.TGD_Kod AS [Kod GRUPY],
TWR.Twr_Kod AS [Kod towaru],
sum(CASE WHEN TwZ_MagNumer = ??Mag1 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 1],
sum(CASE WHEN TwZ_MagNumer = ??Mag2 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 2],
sum(CASE WHEN TwZ_MagNumer = ??Mag3 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 3],
sum(CASE WHEN TwZ_MagNumer = ??Mag4 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 4],
sum(CASE WHEN TwZ_MagNumer = ??Mag5 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 5],
sum(CASE WHEN TwZ_MagNumer = ??Mag6 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 6],
sum(CASE WHEN TwZ_MagNumer = ??Mag7 THEN TwZ_IlSpr ELSE 0 END) AS [Ilość na Magazynie 7],
(select SUM(Tre_Ilosc) from cdn.traelem INNER JOIN
CDN.TraNag ON Trn_GIDNumer=Tre_GIDNumer AND Trn_GIDTyp=TrE_GIDTyp and tre_twrkod=TWR.Twr_Kod
and TRN_DATA3 >=??Data_Od AND
TRN_DATA3 <=??Data_Do
where TRN_MagZNumer=??Mags) as [Ilosc sprzedana]
FROM
CDN.TwrZasoby AS ZAS LEFT OUTER JOIN
CDN.TwrKarty AS TWR ON ZAS.TwZ_TwrNumer = TWR.Twr_GIDNumer INNER JOIN
CDN.TwrGrupyDom AS TGD1 ON Twr_GIDNumer = TGD1.TGD_GIDNumer INNER JOIN
CDN.TwrGrupyDom AS TGD2 ON (TGD1.TGD_GrONumer = TGD2.TGD_GIDNumer)
WHERE
TGD1.TGD_GIDTyp = 16 AND
TGD2.TGD_GIDTyp = -16 AND
TGD2.TGD_Kod LIKE ??kod_grupy + '%' AND
TWR.Twr_Typ = 1 AND
ZAS.TwZ_MagNumer IN (??Mag1, ??Mag2, ??Mag3, ??Mag4, ??Mag5, ??Mag6, ??Mag7)
GROUP BY
TGD2.TGD_Kod,
TWR.Twr_Kod,
ZAS.TwZ_MagNumer
HAVING
SUM(ZAS.TwZ_IlSpr) <> 0
ORDER BY
TGD2.TGD_Kod , TWR.Twr_Kod
I na zadanie domowe, masz zrobić tak, żeby twoja kolumna ilość sprzedana była ilością sprzedaną, a nie wydaną, kupioną, rozchodowaną i przyjęta