Dziwne sumowanie kolumny

0

Hej ostatnio popełniłem takie oto zapytanie:


declare @temptable2 as table
(WarehouseID nvarchar(128)
,	WarehouseSymbol nvarchar(128)
,	ArticleCode nvarchar(128)
,	ArticleName nvarchar(128)
,	LotId int
,	ArticleBasicUnit nvarchar(128)
,	DeliveryNumberString nvarchar(128)
,	Quantity int
,	Value int
,	UnitPrice int
,	TotalValue int
,	DeliveryDate nvarchar(128)
,	SystemCurrencySymbol nvarchar(128)
,	LackQuantity nvarchar(128)
,	ArticleId int
)

INSERT INTO @temptable2
EXEC Storage.StocksOnDate @WarehouseIDs='2',@Date=@DATADO ,@ShowDelivery=1,@ArticleGroup=1,@FilterExpression=NULL

select * into #temp3

from

(select si.ArticleID  ,si.Code, si.Name, sum (si.Quantity) ilosc_SPRZEDANA
, Year (sh.StoreOperationDate) Rok
, month (sh.StoreOperationDate) Miesiac
, sum(si.finalprice*si.quantity) wartosc

 from SecSales.Headers sh
join Sales.ItemRows si on si.HeaderID=sh.id
join CompanyStructure.CompanyUnits cu on cu.CompanyUnitID=sh.CompanyUnitId
 JOIN DT.DocumentTypes DT ON DT.ID = sh.DocumentTypesID
 JOIN DT.States DS on sh.DocumentStateID = DS.ID
where cu.Name='Lamel Technology' and  dt.Code='MM-' and ds.StateType<>32 
and sh.StoreOperationDate >= @DATAOD 
and sh.StoreOperationDate <=@DATADO
group by si.Code, si.Name,si.ArticleID
, Year (sh.StoreOperationDate) 
, month (sh.StoreOperationDate)


) x



select

-- t.code Kod_WG, t.Name Nazwa_WG,
 t.Rok, t.Miesiac,
  t.Code Kod_surowca,sa.name Nazwa_surowca,
 a.Nazwa_Atrybutu Atrybut_SUROWCA,a.Wartosc_Atrybutu Wartosc_Atrybutu_SUROWCA,
sum (t.ilosc_SPRZEDANA) ilosc_surowca
,sa.Id
,0 stan_mag
,0 wart_mag
 ,t.code code, sa.name name
from #temp3 t 

--r.ArticleCode is null
join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		ac.AttributeClassID=@ATRYBUT
		and a.ObjectTypeID=35 ) a on a.ObjectID=t.articleid

join Dic_Articles sa on sa.id=t.articleid
group by t.Rok, t.Miesiac, t.Code,
  sa.name ,sa.id,
 a.Nazwa_Atrybutu,a.Wartosc_Atrybutu 


union all

 select x.*, isnull(s1.ilosc_mag,0) stan_mag, isnull(s1.wartosc_mag,0) wart_mag, isnull(s1.Code,x.Kod_surowca) Kod, isnull(s1.name, x.Nazwa_surowca) Nazwa
 
  from

(select

-- t.code Kod_WG, t.Name Nazwa_WG,
 0 Rok , 0 Miesiac, t.Code Kod_surowca,
  sa.name Nazwa_surowca,
 a.Nazwa_Atrybutu Atrybut_SUROWCA,a.Wartosc_Atrybutu Wartosc_Atrybutu_SUROWCA,
sum (t.ilosc_SPRZEDANA) ilosc_surowca
,sa.Id




from #temp3 t 
 
--r.ArticleCode is null
join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		ac.AttributeClassID=@ATRYBUT
		and a.ObjectTypeID=35  ) a on a.ObjectID=t.ArticleID

join Dic_Articles sa on sa.id=t.ArticleId




group by 
 sa.name ,sa.id, t.Code,
 a.Nazwa_Atrybutu,a.Wartosc_Atrybutu ) x

 full outer join  ( select l.ArticleID, xyz.Quantity ilosc_mag , xyz.TotalValue wartosc_mag,DA.Code, da.Name
		from Storage.Lots l 
		join Storage.Stocks ss on ss.LotID=l.LotID
		join dic_articles da on da.Id=l.ArticleID
		join @temptable2 xyz on xyz.ArticleCode=Code
		join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		ac.AttributeClassID=@ATRYBUT
		and a.ObjectTypeID=35) a on a.ObjectID=l.ArticleID
		where ss.IsLack=0 and ss.Quantity>0 and ss.WarehouseID=2
		group by l.ArticleID, da.Code, da.name, xyz.quantity, xyz.totalvalue) s1 on s1.ArticleID=x.id
		
--order by t.Name, t.Code

drop table #temp3

Odpowiada ono za rotację towarów na magazynie, wg przesunięć z magazynu jednego na każdy pozostały. Na początek wywoływana jest procedura, która generuje stan magazynu na wybrany dzień i wrzucane jest wszystko do tabelki tymczasowej.
Raport wygląda tak jak w załączeniu.
I nie wiem jak rozwiązać dwie rzeczy, teraz jeśli towar rotuje to jego stan jest wrzucany w kolumny '0', a ten co nie rotował to w pierwsze kolumny, których miesiąc jest określany jako puste. Czego brakuje mi w kodzie, żeby to ładnie było segregowane? Chyba, ze przekombinowałem cała strukturę ;)

Druga sprawa, zmodyfikowałem trochę powyższy kod, aby obsługiwał inny magazyn w trochę innym zakresie. W sumie wyrzuciłem jeden warunek z WHERE (dokładnie ten ac.AttributeClassID=@ATRYBUT) oraz zmieniłem magazyn i dodałem warunek między, którymi magazynami przesunięcia ma wybierać. Niestety w kolumnie '0' kod zaczął mi pokazywać pięciokrotność wartości magazynu:



declare @temptable2 as table
(
	WarehouseID nvarchar(128)
,	WarehouseSymbol nvarchar(128)
,	ArticleCode nvarchar(128)
,	ArticleName nvarchar(128)
,	LotId int
,	ArticleBasicUnit nvarchar(128)
,	DeliveryNumberString nvarchar(128)
,	Quantity int
,	Value int
,	UnitPrice int
,	TotalValue int
,	DeliveryDate nvarchar(128)
,	SystemCurrencySymbol nvarchar(128)
,	LackQuantity nvarchar(128)
,	ArticleId int

)
INSERT INTO @temptable2
EXEC Storage.StocksOnDate @WarehouseIDs='15',@Date=@DATADO ,@ShowDelivery=1,@ArticleGroup=1,@FilterExpression=NULL

select * into #temp3

from

(select si.ArticleID  ,si.Code, si.Name, sum (si.Quantity) ilosc_SPRZEDANA
, Year (sh.StoreOperationDate) Rok
, month (sh.StoreOperationDate) Miesiac
, sum(si.finalprice*si.quantity) wartosc

 from SecSales.Headers sh
join Sales.ItemRows si on si.HeaderID=sh.id
join CompanyStructure.CompanyUnits cu on cu.CompanyUnitID=sh.CompanyUnitId
 JOIN DT.DocumentTypes DT ON DT.ID = sh.DocumentTypesID
 JOIN DT.States DS on sh.DocumentStateID = DS.ID
where cu.Name='Lamel Technology' and  dt.Code='MM-' and ds.StateType<>32 and sh.SourceStoreID='15' and sh.TargetStoreID='16'
and sh.StoreOperationDate >= @DATAOD 
and sh.StoreOperationDate <=@DATADO
group by si.Code, si.Name,si.ArticleID
, Year (sh.StoreOperationDate) 
, month (sh.StoreOperationDate)


) x

select

-- t.code Kod_WG, t.Name Nazwa_WG,
 t.Rok, t.Miesiac,
  t.Code Kod_surowca,sa.name Nazwa_surowca,
 a.Nazwa_Atrybutu Atrybut_SUROWCA,a.Wartosc_Atrybutu Wartosc_Atrybutu_SUROWCA,
sum (t.ilosc_SPRZEDANA) ilosc_surowca
,sa.Id
,0 stan_mag
,0 wart_mag
 ,t.code code, sa.name name
from #temp3 t 

--r.ArticleCode is null
join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		a.ObjectTypeID=35 ) a on a.ObjectID=t.articleid

join Dic_Articles sa on sa.id=t.articleid
group by t.Rok, t.Miesiac, t.Code,
  sa.name ,sa.id,
 a.Nazwa_Atrybutu,a.Wartosc_Atrybutu 


union all

 select x.*, isnull(s1.ilosc_mag,0) stan_mag, isnull(s1.wartosc_mag,0) wart_mag, isnull(s1.Code,x.Kod_surowca) Kod, isnull(s1.name, x.Nazwa_surowca) Nazwa
 
  from

(select

-- t.code Kod_WG, t.Name Nazwa_WG,
 0 Rok , 0 Miesiac, t.Code Kod_surowca,
  sa.name Nazwa_surowca,
 a.Nazwa_Atrybutu Atrybut_SUROWCA,a.Wartosc_Atrybutu Wartosc_Atrybutu_SUROWCA,
sum (t.ilosc_SPRZEDANA) ilosc_surowca
,sa.Id


from #temp3 t 
 
--r.ArticleCode is null
join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		a.ObjectTypeID=35  ) a on a.ObjectID=t.ArticleID

join Dic_Articles sa on sa.id=t.ArticleId




group by 
 sa.name ,sa.id, t.Code,
 a.Nazwa_Atrybutu,a.Wartosc_Atrybutu ) x

 full outer join  ( select l.ArticleID, xyz.Quantity ilosc_mag , xyz.TotalValue wartosc_mag,DA.Code, da.Name
		from Storage.Lots l 
		join Storage.Stocks ss on ss.LotID=l.LotID
		join dic_articles da on da.Id=l.ArticleID
		join @temptable2 xyz on xyz.ArticleID=l.ArticleID
		join 
	(select tv1.Value Nazwa_Atrybutu, tv2.Value Wartosc_Atrybutu, a.ObjectID, a.ObjectTypeID, aa.Code Kod_towaru  from 
	SecAttributes.AttributeClasses ac 
	join Dictionaries.TranslationValues tv1 on tv1.TranslationID=ac.NameTranslationID and tv1.LanguageID=1
	join Attributes.Attributes a on a.AttributeClassID=ac.AttributeClassID
	join Dictionaries.TranslationValues tv2 on tv2.TranslationID=a.ValueTranslationID and tv1.LanguageID=1
	join Dic_Articles aa on aa.id=a.ObjectID
		where 
		a.ObjectTypeID=35) a on a.ObjectID=l.ArticleID
		where ss.IsLack=0 and ss.Quantity>0 and ss.WarehouseID=15
		group by l.ArticleID, da.Code, da.name, xyz.quantity, xyz.totalvalue) s1 on s1.ArticleID=x.id
		
--order by t.Name, t.Code

drop table #temp3

Może uda się Wam wskazać gdzie popełniam błąd...

0

Ok, kwestie sumowania wielokrotności stanu ogarnąłem, sumował wartość dla każdego atrybutu.

2

Masz poczucie humoru...

Wklejasz skrypt na ponad 150 linii w screenie jakiś wynik końcowy, który nijak się ma do zapytania, nie wiemy co jest w danych które obrabiasz, dodatkowo opisujesz skrypt tak jakby struktura była oczywista dla czytającego. Jak mamy to organąć?

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