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

Odpowiedz Nowy wątek
2018-11-03 10:12
Smutny Rycerz
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

Pozostało 580 znaków

2018-11-03 11:16
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)

Pozostało 580 znaków

2018-11-03 13:16
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
edytowany 4x, ostatnio: mariano901229, 2018-11-03 13:22

Pozostało 580 znaków

2018-11-03 13:23
Smutny Rycerz
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

Pozostało 580 znaków

2018-11-03 13:52
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...

Pozostało 580 znaków

2018-11-05 00:03
Smutny Rycerz
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

Pozostało 580 znaków

2018-11-05 00:31
0

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

Pozostało 580 znaków

2018-11-14 16:46
Smutny Rycerz
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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