Zsumowane wartości z wierszy w kolumnach

0

Chciałbym z tabeli takiej jak:

ID Stan Asortyment ID Magazyn ID
1 0 1 1
2 5 2 1
3 1 3 1
4 2 4 1
5 1 1 2
6 6 2 2
7 4 3 2

Zrobić tabelkę ze stanami w magazynach na zasadzie:

Asortyment ID | Magazyn 1 | Magazyn 2
---------------- | -------------------
1| 0|2
2| 5|6
3| 1|4

Dodatkowym utrudnieniem jest to, że chciałbym aby w tej tabelce wynikowej pokazywały się asortymenty niezawarte w pierwszej tabeli ("stanymagazynowe") a zawarte w tabeli "asortymenty" - czy tak wystarczy?

FULL JOIN ModelDanychContainer.StanyMagazynowe ON StanyMagazynowe.Asortyment_ID=Asortymenty.ID
2

FULL JOIN jest niepotrzebny skoro znasz wszystkie wartości asortymentów, wystarczy LEFT i PIVOT

select
    id, isnull([1],0) as [Magazyn 1],isnull([2],0) as [Magazyn 2]
from (
  select
    a.id
    ,s.Stan
    ,MagazynID
   From
    asortymenty a
    left join StanyMagazynowe S on s.AsortymentID = a.ID) as sc
PIVOT
  (
    sum(Stan) for MagazynID in ([1],[2])
    ) as pv

http://sqlfiddle.com/#!18/90de8/4

0

Czyli dla 3 magazynów o ID 100000 100005 100006 mam kod:

SELECT
    id
    ,isnull([100000],0) AS [Magazyn 1]
    ,isnull([100005],0) AS [Magazyn 2]
    ,isnull([100006],0) AS [Magazyn 3]
FROM (
  SELECT
    ASO.id
    ,STANY.IloscDostepna
    ,STANY.Magazyn_ID
   FROM
    ModelDanychContainer.Asortymenty ASO
    LEFT JOIN ModelDanychContainer.StanyMagazynowe STANY ON STANY.Asortyment_ID = ASO.ID) AS sc
PIVOT
  (
    SUM(IloscDostepna) FOR Magazyn_ID IN ([100000],[100005],[100006])
    ) AS pv

Chciałbym dodać jeszcze kolumny z tabeli ASO Nazwa oraz kolumnę ze stanem zsumowanych magazynów. Kombinowałem trochę, ale bez skutków.

PS:
Swoją drogą, dlaczego trzeba przed PIVOTEM i na końcu używać "AS" skoro nie są nigdzie wykorzystane?

0

Daj fiddle i pokaż co już napisałeś

0

http://sqlfiddle.com/#!18/de9f7/1
Dla takiej bazy chciałbym jeszcze żeby w wyniku pokazywała się nazwa z tabeli asortymenty oraz zsumowany stan z wszystkich magazynów. Po prostu nie wiem w którym miejscu to umieścić, gdziekolwiek to zrobię to mi nie działa..

1
select
    id, Nazwa, isnull([1],0) as [Magazyn 1],isnull([2],0) as [Magazyn 2]
from (
  select
    a.id
    ,a.Nazwa
    ,s.Stan
    ,MagazynID
   From
    asortymenty a
    left join StanyMagazynowe S on s.AsortymentID = a.ID) as sc
PIVOT
  (
    sum(Stan) for MagazynID in ([1],[2])
    ) as pv
1

Aby dodać kolumnę razem która zsumuje stany dla magazanyów to masz kilka możliwości:

#1 Dodawanie kolumn

select
    id, isnull([1],0) as [Magazyn 1],isnull([2],0) as [Magazyn 2], isnull([1],0)+isnull([2],0) Razem
from (
  select
    a.id
    ,s.Stan
    ,MagazynID
   From
    asortymenty a
    left join StanyMagazynowe S on s.AsortymentID = a.ID) as sc
PIVOT
  (
    sum(Stan) for MagazynID in ([1],[2])
    ) as pv;
     

#2 Window function

select
    id, isnull([1],0) as [Magazyn 1],isnull([2],0) as [Magazyn 2], Razem
from (
  select
    a.id
    ,s.Stan
    ,MagazynID
   ,sum(stan) over (partition by a.id) Razem
   From
    asortymenty a
    left join StanyMagazynowe S on s.AsortymentID = a.ID) as sc
PIVOT
  (
    sum(Stan) for MagazynID in ([1],[2])
    ) as pv;

#Union

select
    id, isnull([1],0) as [Magazyn 1],isnull([2],0) as [Magazyn 2], isnull([0],0) Razem
from (
  select
    a.id
    ,s.Stan
    ,MagazynID
   From
    asortymenty a
    left join StanyMagazynowe S on s.AsortymentID = a.ID
    union all
    select
        a.id
        ,s.Stan
        ,0 MagazynID
     From
        asortymenty a
        left join StanyMagazynowe S on s.AsortymentID = a.ID
) as sc
PIVOT
  (
    sum(Stan) for MagazynID in ([1],[2],[0])
    ) as pv;
    
0

Super, dzięki, sumowanie mi wystarczy :)

Jak mam dodać pole nazwa z tabeli asortymenty?

Jak wrzucam w SELECT to wyskakuje mi:

The multi-part identifier "ASO.Nazwa" could not be bound.

0
SELECT
	Id    
    ,Symbol
    ,Nazwa
    ,isnull([100000],0) AS [Magazyn 1]
    ,isnull([100005],0) AS [Magazyn 2]
    ,isnull([100006],0) AS [Magazyn 3]
    ,isnull([100000],0)+isnull([100005],0)+isnull([100006],0) Razem
FROM (
  SELECT
    ASO.id
    ,ASO.Symbol
    ,ASO.Nazwa
    ,STANY.IloscDostepna
    ,STANY.Magazyn_ID
   FROM
    ModelDanychContainer.Asortymenty ASO
    LEFT JOIN ModelDanychContainer.StanyMagazynowe STANY ON STANY.Asortyment_ID = ASO.ID) AS sc
PIVOT
  (
    SUM(IloscDostepna) FOR Magazyn_ID IN ([100000],[100005],[100006])
    ) AS pv

Mam takie zapytanie, chciałbym dodać jeszcze jedną kolumnę, z innej tabeli -

JOIN ModelDanychContainer.GrupyAsortymentu GRUPY ON GRUPY.ID = ASO.GRUPA_ID

Próbując jednak coś wyciągnąć z tej tabeli poniższym sposobem zwraca mi
4104 the multi-part identifier could not be bound - pewnie umieszczam źle tego JOINA

SELECT
	Id    
    ,Symbol
    ,GRUPY.Nazwa
    ,Nazwa
    ,isnull([100000],0) AS [Magazyn 1]
    ,isnull([100005],0) AS [Magazyn 2]
    ,isnull([100006],0) AS [Magazyn 3]
    ,isnull([100000],0)+isnull([100005],0)+isnull([100006],0) Razem
FROM (
  SELECT
    ASO.id
    ,ASO.Symbol
    ,ASO.Nazwa
    ,GRUPY.Nazwa
    ,STANY.IloscDostepna
    ,STANY.Magazyn_ID
   FROM
    ModelDanychContainer.Asortymenty ASO
    LEFT JOIN ModelDanychContainer.StanyMagazynowe STANY ON STANY.Asortyment_ID = ASO.ID
    JOIN ModelDanychContainer.GrupyAsortymentu GRUPY ON GRUPY.ID = ASO.GRUPA_ID) AS sc
PIVOT
  (
    SUM(IloscDostepna) FOR Magazyn_ID IN ([100000],[100005],[100006])
    ) AS pv

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