Hej
Mam problem z poprawnym wyświetleniem ilości z 2 tabel. Potrzebuje sumę Przyjęć i Wydań na jednym zapytaniu. Problem jest taki, że Np. PW jest jedno a RW jest 30. Na tabeli duplikuje PW do ilości RW.
Pogrupuj obie tabele po numerze dokumnetu i indeksie towaru obliczając sumy. Następnie połącz te dwa zapytania, najlepiej używając FULL JOINa. (taki opis słowno-muzyczny)
Pewnie autorowi chodzi, żeby mieć w jednym zestawieniu dokumenty z danym kodem towaru i obok w wierszach drugie.
Czyli takie coś:
Ilość RW | Odwołanie do RW | Ilość PW | Odwołanie do PW |
---|---|---|---|
100 | dokument 2000 | 220 | dokument 2121 |
NULL | NULL | 200 | dokument 2123 |
Suma RW | Suma PW |
---|---|
100 | 420 |
Suma w SAP B1 (a to jest menadżer zapytań z tego programu) jest obliczana automatycznie w tych pseudokontrolkach. Jeżeli potrzebowałby odwołać się do tych dokumentów poprzez strzałki to muszą być one powiązane z id dokumentu.
Jeżeli tak to ciężko takie coś osiągnąć w tym oprogramowaniu, w którym nawet zwykły interfejs do bazy danych jest skopany. Trzeba by było zrobić takie zapytanie jak poniże (nazwy kolumn celowo tak nazwane, być może SAP złapie połączenie), dodatkowo może mieć problem z funkcjami wbudowanymi w SQL Server takimi jak row_number i partition over.
Rozbicie tego na dwa zapytania w SAP B1 w menadżerze zapytań rozwiązuje problem lub przedstawienie tylko sum w ramach jednego wiersza, bez powiązań z dokumentami.
Zapytanie pisane na szybko, więc pewno można to ze 30 razy zoptymalizować.
select * from
(select tab1.ItemCode,
case when (rw =1) then [IGN1.DocEntry] else null end as 'IGN1.DocEntry',
case when (rw =1) then [IGN1.Quantity] else null end as 'IGN1.Quantity',
case when (rwIGE =1) then [IGE1.DocEntry] else null end as 'IGE1.DocEntry',
case when (rwIGE =1) then [IGE1.Quantity] else null end as 'IGE1.Quantity'
from
(select row_number() over(partition by IGN1.DocEntry order by IGN1.DocEntry) as rw, IGN1.ItemCode,
IGN1.DocEntry as 'IGN1.DocEntry',IGN1.Quantity as 'IGN1.Quantity',
row_number() over(partition by IGE1.DocEntry order by IGE1.DocEntry) as rwIGE,
IGE1.DocEntry as 'IGE1.DocEntry', IGE1.Quantity as 'IGE1.Quantity'
from IGN1
inner join IGE1 on IGE1.ItemCode = IGN1.ItemCode
) tab1 )tab
where
ItemCode = '08000009'and
([IGE1.DocEntry] is not null or [IGN1.DocEntry] is not null)
order by [IGN1.DocEntry] desc
Może to powinno być w dziale Newbie bo dopiero zaczynam i nie ogarniam. Zapytania pisze dla siebie w SAP bo ułatwiają codzienna pracę.
Nie dogadamy się. Weź wrzuć na jakiegoś fiddle (np. sql-fiddle.com) próbkę danych z obu tabel i napisz jaki wynik chciałbyś osiągnąć.
Poza tym FUUL JOIN w połączemiu z WHERE na jedną tabelę jest trochę bezsensowny...
Tak, dokładnie o coś takiego mi chodziło.
Twoje zapytanie zadziałało prawie dobrze nie wiem czemu zgubił 1 wpis.
Zastanawia mnie przedstawienie jedynie sum indeksu RW i PW w jednym wierszu. W ramach prostego zapytania też mam problem.
RW powinno być "14"- jeden dokument. Powielony jest do ilości wpisów PW.
mariano901229 napisał(a):
Pewnie autorowi chodzi, żeby mieć w jednym zestawieniu dokumenty z danym kodem towaru i obok w wierszach drugie.
Czyli takie coś:
Ilość RW Odwołanie do RW Ilość PW Odwołanie do PW 100 dokument 2000 220 dokument 2121 NULL NULL 200 dokument 2123
Suma RW Suma PW 100 420 Suma w SAP B1 (a to jest menadżer zapytań z tego programu) jest obliczana automatycznie w tych pseudokontrolkach. Jeżeli potrzebowałby odwołać się do tych dokumentów poprzez strzałki to muszą być one powiązane z id dokumentu.
Jeżeli tak to ciężko takie coś osiągnąć w tym oprogramowaniu, w którym nawet zwykły interfejs do bazy danych jest skopany. Trzeba by było zrobić takie zapytanie jak poniże (nazwy kolumn celowo tak nazwane, być może SAP złapie połączenie), dodatkowo może mieć problem z funkcjami wbudowanymi w SQL Server takimi jak row_number i partition over.
Rozbicie tego na dwa zapytania w SAP B1 w menadżerze zapytań rozwiązuje problem lub przedstawienie tylko sum w ramach jednego wiersza, bez powiązań z dokumentami.
Zapytanie pisane na szybko, więc pewno można to ze 30 razy zoptymalizować.
select * from (select tab1.ItemCode, case when (rw =1) then [IGN1.DocEntry] else null end as 'IGN1.DocEntry', case when (rw =1) then [IGN1.Quantity] else null end as 'IGN1.Quantity', case when (rwIGE =1) then [IGE1.DocEntry] else null end as 'IGE1.DocEntry', case when (rwIGE =1) then [IGE1.Quantity] else null end as 'IGE1.Quantity' from (select row_number() over(partition by IGN1.DocEntry order by IGN1.DocEntry) as rw, IGN1.ItemCode, IGN1.DocEntry as 'IGN1.DocEntry',IGN1.Quantity as 'IGN1.Quantity', row_number() over(partition by IGE1.DocEntry order by IGE1.DocEntry) as rwIGE, IGE1.DocEntry as 'IGE1.DocEntry', IGE1.Quantity as 'IGE1.Quantity' from IGN1 inner join IGE1 on IGE1.ItemCode = IGN1.ItemCode ) tab1 )tab where ItemCode = '08000009'and ([IGE1.DocEntry] is not null or [IGN1.DocEntry] is not null) order by [IGN1.DocEntry] desc
Na postgreSQL, ale na MS SQL Server powinno być tak samo... http://sqlfiddle.com/#!15/7e103/1
Sorki za tak późną odpowiedź.
Wszystko działa dzięki dzięki za podpowiedź i fajną stronkę do zabawy i testów.