Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एसक्यूएल में इन्वेंटरी औसत लागत गणना

आप इस पुनरावर्ती गणना को करने के लिए मॉडल क्लॉज का उपयोग कर सकते हैं

नमूना तालिका बनाएं और डेटा डालें

create table costs (order_id int, volume int, price numeric(16,4), type char(1));

insert into costs (order_id, volume, price) values (1,1000,100);
insert into costs (order_id, volume, price) values (2,-500,110);
insert into costs (order_id, volume, price) values (3,1500,80);
insert into costs (order_id, volume, price) values (4,-100,150);
insert into costs (order_id, volume, price) values (5,-600,110);
insert into costs (order_id, volume, price) values (6,700,105);

क्वेरी (संपादित rules iterate(1000) . बदल रहा है rules automatic order . के लिए मॉडल क्लॉज को लागू करता है क्योंकि यह कार्य करने का इरादा रखता है, यानी क्रमिक रूप से ऊपर से नीचे। इसने क्वेरी को 0.44s से 0.01s तक ले लिया!)

select order_id, volume, price, total_vol, total_costs, unit_costs
    from (select order_id, volume, price,
                 volume total_vol,
                 0.0 total_costs,
                 0.0 unit_costs,
                 row_number() over (order by order_id) rn
          from costs order by order_id)
   model
         dimension by (order_id)
         measures (volume, price, total_vol, total_costs, unit_costs)
         rules automatic order -- iterate(1000)
         ( total_vol[any] = volume[cv()] + nvl(total_vol[cv()-1],0.0),
           total_costs[any] =
                    case SIGN(volume[cv()])
                    when -1 then total_vol[cv()] * nvl(unit_costs[cv()-1],0.0)
                    else volume[cv()] * price[cv()] + nvl(total_costs[cv()-1],0.0)
                    end,
           unit_costs[any] = total_costs[cv()] / total_vol[cv()]
         )
   order by order_id

आउटपुट

ORDER_ID VOLUME     PRICE      TOTAL_VOL   TOTAL_COSTS   UNIT_COSTS
1        1000       100        1000        100000        100
2        -500       110        500          50000        100
3        1500        80        2000        170000        85
4        -100       150        1900        161500        85
5        -600       110        1300        110500        85
6        700        105        2000        184000        92

इस साइट में मॉडल खंड पर एक अच्छा ट्यूटोरियल है

  • http://www.sqlsnippets.com/hi/topic-11663.html

ऊपर दिए गए डेटा के लिए एक्सेल शीट इस तरह दिखेगी, जिसमें फॉर्मूला नीचे की ओर बढ़ा हुआ होगा
    A         B       C      D          E                         F
 ---------------------------------------------------------------------------
1|  order_id  volume  price  total_vol  total_costs               unit_costs
2|                                   0                         0           0
3|  1           1000    100  =C4+E3     =IF(C4<0,G3*E4,F3+C4*D4)  =F4/E4
4|  2           -500    110  =C5+E4     =IF(C5<0,G4*E5,F4+C5*D5)  =F5/E5
5|  3           1500     80  =C6+E5     =IF(C6<0,G5*E6,F5+C6*D6)  =F6/E6
6|  4           -100    150  =C7+E6     =IF(C7<0,G6*E7,F6+C7*D7)  =F7/E7
7|  5           -600    110  =C8+E7     =IF(C8<0,G7*E8,F7+C8*D8)  =F8/E8
8|  6           700     105  =C9+E8     =IF(C9<0,G8*E9,F8+C9*D9)  =F9/E9


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. HikariCP:Oracle 11g के लिए अधिकतम लाइफटाइम सेट करने के लिए किस डेटाबेस स्तर के टाइमआउट पर विचार किया जाना चाहिए

  2. चेकर रन

  3. ORA-02287:यहां अनुक्रम संख्या की अनुमति नहीं है

  4. एक Oracle लेखा परीक्षा जीवित रहना

  5. 19.3 PDB बंद ORA-65107 ORA-16078