Połączenie 2 tabel i powtarzające się wpisy

0

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.
title

1

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)

0

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
0

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ę.
title

0

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...

0

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.
title
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
0

Na postgreSQL, ale na MS SQL Server powinno być tak samo... http://sqlfiddle.com/#!15/7e103/1

0

Sorki za tak późną odpowiedź.
Wszystko działa dzięki dzięki za podpowiedź i fajną stronkę do zabawy i testów.

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