[SQL] Rozbijanie ilości towaru na paletach


(system) #1

Witam, mam nadzieję, że może ktoś mi pomoże rozwiązać problem.

  1. Mamy towar, który ma przydzieloną maksymalną ilość na paletę załóżmy, że 130, jego nazwę, kodtowaru (z bazy)

  2. Mamy ilość danego towaru, która została załadowana w całym transporcie np. 300 (z bazy)

  3. Trzeba również obliczyć wagę z danych uzyskanych z bazy, ze wzoru powierzchnia_uzytkowa * ilosc_na_palecie * gramatura \ 1000

Do tej pory udało mi się za pomocą dwóch SELECT i join do master.dbo.spt_values na przykładzie powyższego polecenia otrzymać trzy rekordy

1 | nazwa | kod | 130 | 169

2 | nazwa | kod | 130 | 169

3 | nazwa | kod | 130 | 169

gdzie 130 to ilość, a 169 waga w kg, jest to niepoprawne, ponieważ w trzecim rekordzie powinno być ilość 40, i waga około 52.

Czy jest możliwe takie zapytanie, żeby w ostatnim rekordzie w przypadku kiedy ilosc % ilosc_na_palete != 0 zmieniało obliczenia i podstawiało w ilosc_na_palecie wynik z ilosc % ilosc_na_palete?

 

Pozdrawiam, liczę na dobry pomysł.

 

 

 


(GeloXD) #2

Poka polecenie.


(system) #3
SELECT 
WEW.Kod_towaru AS KodTowaru, WEW.Id_towaru
,WEW.Nazwa AS NazwaTowaru
,(CAST(WEW.Ilosc / PaletyBZ AS DECIMAL(15,0))) AS Ilosc /* ilosc na palecie */
,(CAST(WEW.Powierzchnia * WEW.SztNaPalete * CAST(WEW.Gramatura AS integer) / 1000 AS DECIMAL(15, 3))) as [KG]
FROM
	(SELECT DISTINCT Nazwa, Ilosc, Kod_towaru, NazwaKontrahenta, Id_transakcji, Id_towaru, Powierzchnia, Gramatura
	,CEILING((Ilosc/(CASE WHEN SztNaPalete<>0 THEN SztNaPalete WHEN SztNaPalete=0 THEN 1 END))) AS Palety /*zaokrąglona do góry dla otrzymania ilości palet */
	,(Ilosc/(CASE WHEN SztNaPalete<>0 THEN SztNaPalete WHEN SztNaPalete=0 THEN 1 END)) AS PaletyBZ /* ilosc palet bez zaokrąglenia */
	, SztNaPalete
	FROM Transakcje
	JOIN Inne_tabele
	WHERE Kod_towaru LIKE '%1122311%' AND Id_tansakcji = 23331241) AS WEW			
INNER JOIN master.dbo.spt_values ON (master.dbo.spt_values.number <= Palety AND master.dbo.spt_values.name is NULL AND master.dbo.spt_values.number<>0) /* dla wywołania 3 rekordów */

Nazwy kolumn są przykładowe.