Pomoc w zadaniu SQL opartym o transakcje

0

Witam, potrzebuje pomocy w wykonaniu zadania: Korzystając z transakcji obniżyć o 15% sugerowaną cenę towarów, których ilość na stanie w każdym magazynie jest większa niż 70%.
moje próby wyglądały mniej więcej tak

UPDATE product pz, warehouse wz, inventory iz
SET pz.suggested_price=pz.suggested_price-pz.suggested_price*1.5
FROM inventory iz JOIN product pz ON iz.product_id=pz.id JOIN warehouse Wz ON iz.warehouse_id=wz.id
WHERE iz.amount_in_stock=ALL(iw.amount_in_stock /iw.max_in_stock>0.7);

Ale nie bardzo wiem co tu poprawić żeby śmigało z-zewnętrze zapytanie, w-wewnętrzne.
W załączniku dołączam model
Proszę o pomoc, pozdrawiam i z góry dzięki!

title

2

nie wiem jaki silnik, bo są pewne róznice przy składni update z joinem.
ALL mi tu za bardzo nie pasuje, bo powinien odnosić się do podzapytania.
join do warehouse nie jest w ogóle potrzebny

Skup się na zapytaniu które z tabeli inventory wyciągnie towary których stan jest > 70% i wykorzystaj je w join do update'a

0

Pisałem na szybko nie sprawdzałem, jednak spróbował bym takiej formuły:

UPDATE product
SET suggested_price=suggested_price*0.85
WHERE EXISTS
(select id, name, short_desc, suggested_price  from product
WHERE EXISTS 
(select amount_in_stock, max_in_stock from inventory
 WHERE ROUND(amount_in_stock / max_in_stock, 2) > 0.7)
)

lub z joinem:

UPDATE product
SET suggested_price=suggested_price*0.85
WHERE EXISTS(
SELECT product.id, product.name, product.short_desc, product.suggested_price 
from inventory
WHERE ROUND(amount_in_stock / max_in_stock, 2) > 0.7
INNER JOIN product
ON product.id = inventory.id
)
1

@loki121212: nie sprawdzasz założenia:70% stanu na KAŻDYM magazynie, ty sprawdzasz na JAKIMKOLWIEK magazynie

0
Panczo napisał(a):

nie wiem jaki silnik, bo są pewne róznice przy składni update z joinem.

ALL mi tu za bardzo nie pasuje, bo powinien odnosić się do podzapytania.
join do warehouse nie jest w ogóle potrzebny

Skup się na zapytaniu które z tabeli inventory wyciągnie towary których stan jest > 70% i wykorzystaj je w join do update'a

Rozumiem już kolejność tego aczkolwiek nie bardzo ogarniam możliwość sprawdzenia całości za jedną komendą a siedzę już nad tym trochę czasu :/

1

Mam dobry dzień:

select 
    product_id 
from 
   inventory
group by
    product_id
having
   sum(case when amount_in_stock /iw.max_in_stock>0.7 then 0 else 1 end)=0
0

Dzięki wielkie, będę teraz siedział i główkował nad tym :D

0

@Panczo: a teraz?

UPDATE product p
SET suggested_price=suggested_price*0.85
WHERE p.id in (
SELECT product.id 
from inventory
WHERE ROUND(amount_in_stock / max_in_stock, 2) > 0.7
INNER JOIN product
ON product.id = inventory.id
)

0
UPDATE ...
WHERE product_id IN (SELECT Product_id FROM (SELECT product_id, CASE WHEN 100*amount_in_stock/max_in_stock>70 then 1 else 0 END wsk FROM inventory) x GROUP BY 1 HAVING Count(*)=SUM(wsk))
2

kluczem jest zrozumienie tego:

case when amount_in_stock /iw.max_in_stock>0.7 then 0 else 1 end zwraca 0 dla wartości > 70% i 1 dla <=70%, czyli jeżeli wszystkie mają wartość > 70% to suma wyników tego case da nam 0, a warunki na agregaty wstawiamy w having, zadna filozofia

Po komentarzu @Marcin.Miga faktycznie trzeba by zmienić, dla sqlServer:1.0* amount_in_stock /iw.max_in_stock>0.7

3

A tak z głupia się zapytam, bo sam nie wiem. Czy update z zagnieżdżonym selectem będzie zawsze transakcją niezależnie od silnika?

1

Ja zapytam przewrotnie. Czy po dodaniu nowego produktu trafia on od razu do tabeli inventory w postaci osobnego wpisu dla każdego magazynu? Czy może dopiero po zdefiniowaniu stanów maksymalnych? Jeśli nie rafia, to jak zapytanie powinno traktować taki przypadek?
No i czy stan maksymalny może wynosić zero? Bo jeśli tak, to wypadałoby zabezpieczyć się przed dzieleniem przez 0.0

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