Wyświetlanie pozostałej ilości na magazynie

0

Cześć
Tworzę bazę danych w MS Sql i mam jeden problem. Chciałbym stworzyć zapytanie, które obliczałoby na podstawie sztuk sprzedanych i tych, które zostały dostarczone pozostałą ilość produktów na magazynie. Wymyśliłem takie zapytanie:

SELECT  dbo.Produkty.nazwa_produktu AS "Nazwa produktu", 
((Select SUM(ilosc_dostawa) FROM dbo.Dostawa group by nazwa_produktu) - (Select SUM(ilosc_sprzedaz) FROM dbo.Sprzedaz group by nazwa_produktu))
FROM dbo.Produkty
group by dbo.Produkty.nazwa_produktu;

Wyświetla się taki błąd:

Msg 512, Level 16, State 1, Line 190
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Ma ktoś pomysł jak poprawić kod, aby poprawnie obliczał ilość pozostałych sztuk ?

0

Może coś w ten deseń:

select 
	ilosc_dostawa-IFNULL(ilosc_sprzedaz,0) Pozostalo,
	dostarczone.nazwa_produktu
from 
	(select sum(ilosc_dostawa) ilosc_dostawa,nazwa_produktu from dbo.dostawa group by nazwa_produktu) dostarczone
		left join 
	(select sum(ilosc_sprzedaz) ilosc_sprzedaz,nazwa_produktu from dbo.sprzedaz group by nazwa_produktu) sprzedane 
		on (dostarczone.nazwa_produktu=sprzedane.nazwa_produktu)
;

1

a jak baza ma wiedzieć którą sumę odjąć od której sumy,
a co jeśli niczego nie sprzedano dla danego produktu , no i jakieś id zamiast nazwa_produktu, stan magazynu powinien być trzymany w bazie, bo zależy nie tylko od ilości kupionych i sprzedanych towarów

0

To podzapytanie pobiera wszystkie towary, stąd komunikat. Tu wystarczy prosty join

/*
To jest pierwsza wersja zapytanie, które jest złe jak słusznie zauważył Marcin w komentarzu
SELECT  
     p.nazwa_produktu AS "Nazwa produktu"
     isnull(sum(d.ilosc_dostawa),0) -  isnull(SUM(ilosc_sprzedaz),0)
FROM 
    dbo.Produkty P
   left join dbo.Dostawa D on p.id_produkt=d.id_produkt
   left join dbo.Sprzedaz S on p.id_produkt=s.id_produkt
group by 
    p.nazwa_produktu;
*/
SELECT  
     p.nazwa_produktu AS "Nazwa produktu"
     isnull(ilosc_dostawa,0) -  isnull(ilosc_sprzedaz,0)
FROM 
   dbo.Produkty P
   left join (select 
                 id_produkt
                 ,sum(d.ilosc_dostawa) ilosc_dostawa
              FROM
                 dbo.Dostawa
              group by 
                  id_produkt) d on p.id_produkt=d.id_produkt
      left join (select 
                 id_produkt
                 ,sum(d.ilosc_sprzedaz) ilosc_sprzedaz
              FROM
                 dbo.Sprzedaz
              group by 
                  id_produkt) S on p.id_produkt=s.id_produkt

zakładając że masz w każdej z tych 3 tabel kolumnę id_produkt po której można się lączyć

0
SELECT  
   dbo.Produkty.nazwa_produktu AS "Nazwa produktu", 
   Coalesce((Select SUM(ilosc_dostawa) FROM dbo.Dostawa Where dbo.Dostawa.id_produktu=dbo.Produkty.id_produktu),0) - Coalesce((Select SUM(ilosc_sprzedaz) FROM dbo.Sprzedaz Where dbo.Sprzedaz.id_produktu=dbo.Produkty.id_produktu),0)
FROM dbo.Produkty;
0

Dzięki wszystkim za pomoc :)

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