Jak napisac SUMIF w SQL

0

Witam.
Panowie, przepisuje plany produkcyjne w pewnej fabryce ktore kiedys napisałem w Excelu do PHP i mam problem jak zastapić SUMIF na zapytanie SQL. Wyjaśniam jak to działa. Maszyna tnie wielkie płyty 5000cm x 2000m na potrzebna ilosc paneli. Jezeli w programie maszyny jest napisane ze z jednej płyty ma powstac 21 paneli o wymiarach 720x660 (nazwijmy go panel A) to nie ma problemu, czasem jednak zdarza sie ze przy okazji produkcji panela A zostaje jeszcze miejsce na Panel B. I ten panel B musze policzyc w SQL.

Przejdz do zalacznika zeby pobrac rezultat ponizszego zapytania.

Jak widzicie na koncu jest kolumna bPanelToAdd ktora pokazuje nam ze przy produkcji panela A (w tym przypadku KE.208.090.WH w ilosci sztuk 96) powstanie 48 panela B KE.208.072.WH. I to akurat jest prawda jednak ja potrzebuje dodac ten bPanelToAdd w innej kolumnie do autoPlan czyli w tym przypadku do pierwszego wiersza zeby to wygladalo tak, autoplan+bPanelToAdd = 168+48=216

Zapytanie ktore do tej pory zrobilem

select r.* from (
  select
    t.*,
    ((autoPlan / aPanelQty) * bPanelQty) as bPanelToAdd
  from (
         select
           a.*,
           ABS((CASE
                WHEN a.inStock < a.minStock
                  THEN
                    (ceil(((CASE WHEN (a.totalReq < 15 or a.totalReq is null)
                      THEN 25
                            ELSE a.totalReq * 2 END) - a.inStock) /
                          (a.aPanelQty * a.OptimumBoardMultiplay))) * (a.aPanelQty * a.OptimumBoardMultiplay)
                else 0 END)) as autoPlan
         from (
                select
                  ip.ifsCode,
                  ip.description,
                  (CASE WHEN (id.totalReq < 15 or id.totalReq is null)
                    THEN 25
                   ELSE id.totalReq * 2 END) as minStock,
                  (CASE WHEN (id.totalReq < 15 or id.totalReq is null)
                    THEN 25
                   ELSE id.totalReq * 3 END) as maxStock,
                  ip.bPanelDescription,
                  ip.aPanelQty,
                  ip.bPanelQty,
                  id.totalReq,
                  ist.inStock,
                  ip.OptimumBoardMultiplay,

                  (
                    SELECT 2
                    from imaProduction2 ipr
                    where ipr.bPanelDescription = ip.ifsCode
                    limit 1
                  )                          as totalProd
                from imaProduction2 ip
                  left join imaDemand id on id.partNo = ip.ifsCode
                  left join imaStock ist on ist.partNo = ip.ifsCode
                group by ip.ifsCode,
                  ip.bPanelDescription,
                  ip.aPanelQty,
                  ip.bPanelQty,
                  id.totalReq,
                  ist.inStock,
                  ip.description,
                  ip.OptimumBoardMultiplay
              ) a
       ) t
)r

0

Napisz, co konkretnie chcesz uzyskać. Jeśli dobrze zrozumiałem, to napisz if (cos = cos) then sum (*). Napisałem pseudo-code'm.

0
Neutral napisał(a):

Napisz, co konkretnie chcesz uzyskać. Jeśli dobrze zrozumiałem, to napisz if (cos = cos) then sum (*). Napisałem pseudo-code'm.

OK, moze zaplątałem to troche. Jak widzisz na screenie w wierszu 2 przy produkcji panelu KE.208.090.WH produkowane jest z jednej płyty 12 panelu KE.208.090.WH oraz 6 panelu KE.208.072.WH.
Kolumna autoPlan pokazuje ze zeby sprostac zamowieniu trzeba wyprodukowac tego panelu KE.208.090.WH 96 sztuk. Ale przy jego produkcji zostanie tez wyprodukowane 48 panelu KE.208.072.WH. Problem jest taki ze ten panel juz jest w wierszu 1 jako główny i jego potrzeba 168 sztuk do zamowienia. Jak dodac te 48 z wiersza 2 do 168 z wiesza 1 i wyswietlic w nastepnej kolumnie?

EDIT: Panowie sprobuje jeszcze raz. Zapytanie jest takie:

select a.*, ((toDo / a.aPanelQty) * a.bPanelQty) as bPanelToAdd from (
  select
    ip.product1,
    ip.aPanelQty,
    ip.product2,
    ip.bPanelQty,
    ims.inStock,
    id.totalReq,
    (CASE WHEN ims.inStock < id.totalReq
      THEN 300
     ELSE 0 END) as toDo
  from imaProduction3 ip
    left join imaDemand id on id.partNo = ip.product1
    left join imaStock ims on ims.partNo = ip.product1
)a
order by product1

CHodzi oto ze przy produkcji produktu b z wielkiej plyty czasem zeby nie marnowac miejsca jest tez ciety produkt2 czyli mamy dwa produkty. Jak widac na zalaczonym obrazku w wierszu 2 jaki produkt dodatkowy przy produkcji KE.208.090.WH, powstaje KE.208.072.WH. Na 12 produkt1 powstaje 6 produkt2, czyli jezeli mamy wyprodukwiac 300 produkt1 to automatycnzie bedziemy mieli 150 produktu2. Problem polega na tym ze w wierszu 1 ten produkt juz wystepuje ale bez produktu2. Potrzebuje te 150 z wiersza2 dodac do 300 z wiersza 1 w kolejnej dynamicznej kolumnie.

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