Zapytanie Oracle SQL

0

Cześć,

Mam problem z zapytaniem, może ktoś mnie nakieruję.

Mam dwie tabele z danymi: NADANIE(item_id, day_id, qtyS), ODBIOR(item_id, day_id, qtyN)
Dodatkowo mam tabele z czasem TIME i itemami ITEM.
Pojedyncze zapytania typu, dla jednego miesiąca i itemu.

select 
 dd.ITEM_ID
, sum(SH.qtyS) Qty
from XX_NADANIE sh
, XX_TIME d
, XX_ITEM dd
where SH.ITEM_ID = DD.ITEM_ID
and SH.DAY_ID = D.DAY_ID
and DD.ITEM = 'W1AAAA'
and D.MONTH = '2017 / 12'
group by dd.ITEM_ID

Otrzymuję coś takiego:
9390618-112 245

Wyglada ok.
To samo mogę zrobić dla drugiej tabeli:

select 
 dd.ITEM_ID
, sum(SH.qtyN) Qty
from XX_ODBIOR sh
, XX_TIME d
, XX_ITEM dd
where SH.ITEM_ID = DD.ITEM_ID
and SH.DAY_ID = D.DAY_ID
and DD.ITEM = 'W1AAAA'
and D.MONTH = '2017 / 12'
group by dd.ITEM_ID

i wyniki mam:
9390618-112 4

Teraz chcę połączyć dwa zapytania i uzyskać ogolnę wartości dla itemu.

select 
dd.ITEM_ID
, sum(NC.QTY_NCM) Total_Qty_N
, sum(SH.ILOSC_WYS) Total_Qty_S
from XX_ODBIORS NC
, XX_NADANIE sh
, XX_TIME d
, XX_ITEM dd
where NC.ITEM_ID = DD.ITEM_ID
and NC.DAY_ID = D.DAY_ID
and SH.ITEM_ID = DD.ITEM_ID
and SH.DAY_ID = D.DAY_ID
and DD.ITEM = 'W1AAAA'
and D.MONTH = '2017 / 12'
group by dd.ITEM_ID

Ale wyniki jakie otrzymuję to:
9390618-112 3 70

Czyli wyniki są mniejsze niż w pojedynczych zapytaniach.
Jak skonstruować zapytanie, żeby dla danego itemu w tym miesiącu były wartości 'ogólne' z pojedynczych zapytań?

0

Dobra już wiem, te dwa ogólne zapytania musze dać w podzapytania i połączyć je po ITEM i TIME i będzie ok.

0

Nie, zakladam, że skoro masz tabele nadanie, i tabele odbior, jakoś musisz wiedzieć że nadany item został odebrany.
Powiązanie SH.ITEM_ID = NC.ITEM_ID to za mało, bo każdy odbiór będziesz miał powielony tyle razy ile ma odpowiedników w nadaniu.

Przemyśl wyrobienie sobie nawykow pisania joinów, ktoś to widzi pierwszy raz zapytanie nie znając tabel od razu zobaczy po jakich polach łączysz tabelę, a po jakich filtrujesz. samemu też jak wrócisz za jakiś czas do zapytania szybciej się zorientujesz.

SELECT 
	dd.ITEM_ID
	, SUM(NC.QTY_NCM) Total_Qty_N
	, SUM(SH.ILOSC_WYS) Total_Qty_S
FROM	
	XX_ODBIORS NC
	inner join XX_TIME d on NC.DAY_ID = D.DAY_ID
	inner join XX_ITEM dd on NC.ITEM_ID = DD.ITEM_ID
	inner join XX_NADANIE sh on SH.DAY_ID = D.DAY_ID AND SH.ITEM_ID = DD.ITEM_ID
WHERE 
	DD.ITEM = 'W1AAAA'
	AND D.MONTH = '2017 / 12'
GROUP BY 
	dd.ITEM_ID

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.