model ÀýÀ» »ç¿ëÇÏ´Â °æ¿ì
• ³»ºÎÀûÀ¸·Î ÇàÀ» Ãß°¡ÇÒ ¼ö ÀÖ°í, °è»êÇÒ ¼ö ÀÖ´Ù.
• spreadsheetó·³ ÇàÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Ù.
• ANSI (modelÀý), Oracle (spreadsheet Àý).

¡¼Çü½Ä¡½

MODEL ¦ SPREADSHEET

 
¡¼¿¹Á¦¡½½Ç½À Å×ÀÌºí »ý¼º
¼Ò½ºÄÚµå½ÇÇà°á°ú
CREATE TABLE all_sales
 (year        NUMBER NOT NULL,
  month       NUMBER NOT NULL,
  prd_type_id NUMBER,
  emp_id      NUMBER,
  amount      NUMBER(8,2),
  PRIMARY KEY (year, month, prd_type_id, emp_id)
 );
insert into all_sales values(2009,1,1,21,10034.84);
insert into all_sales values(2009,2,1,21,15144.65);
insert into all_sales values(2009,3,1,21,20137.83);
insert into all_sales values(2009,4,1,21,25057.45);
insert into all_sales values(2009,5,1,21,17214.56);
insert into all_sales values(2009,6,1,21,15564.64);
insert into all_sales values(2009,7,1,21,12654.84);
insert into all_sales values(2009,8,1,21,17434.82);
insert into all_sales values(2009,9,1,21,19854.57);
insert into all_sales values(2009,10,1,21,21754.19);
insert into all_sales values(2009,11,1,21,13029.73);
insert into all_sales values(2009,12,1,21,10034.84);
insert into all_sales values(2009,1,1,22,11034.84);
SQL> select * from all_sales;

      YEAR      MONTH PRD_TYPE_ID     EMP_ID     AMOUNT
---------- ---------- ----------- ---------- ----------
      2009          1           1         21   10034.84
      2009          2           1         21   15144.65
      2009          3           1         21   20137.83
      2009          4           1         21   25057.45
      2009          5           1         21   17214.56
      2009          6           1         21   15564.64
      2009          7           1         21   12654.84
      2009          8           1         21   17434.82
      2009          9           1         21   19854.57
      2009         10           1         21   21754.19
      2009         11           1         21   13029.73
      2009         12           1         21   10034.84
      2009          1           1         22   11034.84 

¡¼¿¹Á¦¡½Á¦Ç° ¹øÈ£¸¦ ±âÁØÀ¸·Î ºÐÇÒ, ¿ùº°, ³âµµº° ºÐÇÒ ¿¹Á¦
¼Ò½ºÄÚµå½ÇÇà°á°ú
SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id = 21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (AMOUNT sales_amount)
                 (sales_amount[1,2010] = 
                  sales_amount[1,2009],
                  sales_amount[2,2010] =
                  sales_amount[2,2009] +
                  sales_amount[3,2009],
                  sales_amount[3,2010] =
                  ROUND(sales_amount[3,2009]*1.25,2))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     10034.84
          1       2010          2     35282.48
          1       2010          3     25172.29 

¡¼¿¹Á¦¡½À§ ¿¹Á¦¿¡ month, year ¹®¹ý Ç¥±â °¡´ÉÇÑ ¿¹Á¦
¼Ò½ºÄÚµå½ÇÇà°á°ú
SELECT year, month, prd_type_id, sales_amount
FROM all_sales
WHERE prd_type_id = 1 and emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[1,2010] =
            sales_amount[month=1, year=2009],
            sales_amount[2,2010] =
            sales_amount[month=2, year=2009] +
            sales_amount[month=3, year=2009],
            sales_amount[3,2010] =
            ROUND(sales_amount[month=3, year=2009] * 1.25, 2))
  ORDER BY prd_type_id, year, month;
      YEAR      MONTH PRD_TYPE_ID SALES_AMOUNT
---------- ---------- ----------- ------------
      2009          1           1     10034.84
      2009          2           1     15144.65
      2009          3           1     20137.83
      2009          4           1     25057.45
      2009          5           1     17214.56
      2009          6           1     15564.64
      2009          7           1     12654.84
      2009          8           1     17434.82
      2009          9           1     19854.57
      2009         10           1     21754.19
      2009         11           1     13029.73
      2009         12           1     10034.84
      2010          1           1     10034.84 ¢Ð 2009³âµµ 1¿ù amount 
      2010          2           1     35282.48 ¢Ð 2009³âµµ 2¿ù amount+3¿ù amount 
      2010          3           1     25172.29 ¢Ð 2009³âµµ 3¿ù amount * 1.25 

¡¼¿¹Á¦¡½month BETWEEN 1 AND 3, 2009],2: 1∼3¿ù±îÁöÀÇ Æò±ÕÀ» ±¸ÇÏ°í ¼Ò¼öÁ¡2ÀÚ¸®±îÁö Ç¥Çö
¼Ò½ºÄÚµå½ÇÇà°á°ú
SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[1,2010] =
            ROUND(AVG(sales_amount)
             [month BETWEEN 1 AND 3, 2009], 2))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     15105.77  ¢Ð 1∼3¿ù±îÁöÀÇ sales_amountÀÇ AVG

¡¼¿¹Á¦¡½ANY, year IS ANY : ¸ðµç ³âµµÀÇ ¿ùº° Æò±ÕÀ» ±¸ÇÏ°í ¼Ò¼öÁ¡ 2ÀÚ¸®±îÁö Ç¥Çö
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[1,2010] =
            ROUND(SUM(sales_amount)
             [ANY, year IS ANY], 2))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1    197916.96  ¢Ð 1∼12¿ù±îÁöÀÇ sales_amountÀÇ SUM

¡¼¿¹Á¦¡½sales_amount[1,2010]=sales_amount[currentv(), 2009] : 2010³âµµ 1¿ùÀÇ °ªÀº 2009³âµµ 1¿ù °ªÀÌ Á¸ÀçÇÏ¸é °è»ê
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[1,2010] =
            ROUND(sales_amount
             [currentv(), 2009] * 1.25, 2))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55 ¢Ð 2009³âµµ 1¿ùºÐ 10034.84ÀÇ 1.25¹è

¡¼¿¹Á¦¡½[for month from 1 to 3 increment 1, 2010] : 2010³â 1¿ùºÎÅÍ 3¿ù±îÁö¸¦ 1¾¿ Áõ°¡ÇÏ¿© ¼³Á¤,
IS PRESENT : °á°ú°¡ ¸¸Á·µÇ¸é
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[ FOR month FROM 1 TO 3
            INCREMENT 1, 2010 ] =
               CASE WHEN sales_amount
               [CURRENTV(), 2009] IS PRESENT THEN
               ROUND(sales_amount
               [currentv(), 2009] * 1.25, 2)
                  ELSE 0
                  END)
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55¢Ð 2009³âµµ 1¿ù 10034.84ÀÇ 1.25¹è
          1       2010          2     18930.81¢Ð 2009³âµµ 2¿ù 15144.65ÀÇ 1.25¹è
          1       2010          3     25172.29¢Ð 2009³âµµ 3¿ù 20137.83ÀÇ 1.25¹è

¡¼¿¹Á¦¡½¾ÕÀÇ ¿¹Á¦¸¦ MODELÀ» SPREADSHEET·Î ÁöÁ¤ÇÑ °æ¿ì
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
SPREADSHEET
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[ FOR month FROM 1 TO 3
            INCREMENT 1, 2010 ] =
               CASE WHEN sales_amount
               [CURRENTV(), 2009] IS PRESENT THEN
               ROUND(sales_amount
               [currentv(), 2009] * 1.25, 2)
                  ELSE 0
                  END)
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55¢Ð 2009³âµµ 1¿ù 10034.84ÀÇ 1.25¹è
          1       2010          2     18930.81¢Ð 2009³âµµ 2¿ù 15144.65ÀÇ 1.25¹è
          1       2010          3     25172.29¢Ð 2009³âµµ 3¿ù 20137.83ÀÇ 1.25¹è
MODEL ÇÔ¼ö
model Àý¿¡¼­¸¸ »ç¿ëÇÏ´Â model ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
CURRENTV(dimension_column) dimension Ä÷³ÀÇ °ªÀÌ Á¸ÀçÇÏ¸é ±× °ªÀ» ¹ÝÈ¯ÇØ ÁØ´Ù.
PRESENTNNV(cell, expr1, expr2) Cell °ªÀÌ NOT NULLÀ̸é expr1À» ¹ÝȯÇϰí, NULLÀ̸é expr2¸¦ ¹ÝȯÇÑ´Ù.
PRESENTV(cell, expr1, expr2) spreadsheet Àý¿¡ ÀÇÇØ ½ÇÇàµÇ¾îÁø dimension_columnÀÇ °ª Áß¿¡ Cell°ú µ¿ÀÏÇÑ °ªÀÌ Á¸ÀçÇϸé expr1À» ¹ÝȯÇϰí, Á¸ÀçÇÏÁö ¾ÊÀ¸¸é expr2¸¦ ¹ÝȯÇÑ´Ù.

¡¼¿¹Á¦¡½presentv(sell, expr1,expr2) ÇÔ¼ö´Â °á°ú°¡ ¸¸Á·µÇ¸é expr1, ¾Æ´Ï¸é expr2¸¦
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
           (sales_amount[ FOR month FROM 1 TO 3
            INCREMENT 1, 2010 ] =
               presentv(sales_amount
               [CURRENTV(), 2009],
               ROUND(sales_amount
               [currentv(), 2009] * 1.25, 2), 0))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55
          1       2010          2     18930.81
          1       2010          3     25172.29
Model-Rule Àý
RULES UPDATE °Ë»öÁ¶°Ç°ú µ¿ÀÏÇÑ ÇàÀÌ ¹ß°ßµÇ¸é ÇØ´ç ÇàÀ» updateÇÔ
RULES UPSERT °Ë»öÁ¶°Ç°ú µ¿ÀÏÇÑ ÇàÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ÇØ´ç ÇàÀ» insertÇÔ

¡¼¿¹Á¦¡½RULES UPDATE ¿¹Á¦ [for month from 1 to 3 increment 1, 2010] : Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ÇàÀÌ ÀÖÀ¸¸é round(sales_amount[currentv(), 2009]*1.25,2): round ¹®À» ¼öÇàÇÑ °á°ú·Î ÇØ´ç ÇàÀ» update ÇÏ°í ¾øÀ¸¸é update ¾ÊÇÔ
¼Ò½ºÄÚµå½ÇÇà°á°ú

insert into all_sales 
  values(2010, 1, 1, 21, 11034.84);

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
          RULES UPDATE
           (sales_amount
            [ FOR month FROM 1 TO 3
              INCREMENT 1, 2010 ] =
               ROUND(sales_amount
               [currentv(), 2009] * 1.25, 2))
  ORDER BY prd_type_id, year, month;
PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55

¡¼¿¹Á¦¡½RULES UPSERT¿¹Á¦ ÇØ´ç °ªÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é insertÇÔ
¼Ò½ºÄÚµå½ÇÇà°á°ú

SELECT prd_type_id, year, month, sales_amount
FROM all_sales
WHERE prd_type_id = 1 AND emp_id =21
MODEL
  IGNORE NAV
  PARTITION BY (prd_type_id)
  DIMENSION BY (month, year)
  MEASURES (amount sales_amount)
          RULES UPSERT
           (sales_amount
             [ FOR month FROM 1 TO 3
               INCREMENT 1, 2010 ] =
               ROUND(sales_amount
               [currentv(), 2009] * 1.25, 2))
  ORDER BY prd_type_id, year, month;

PRD_TYPE_ID       YEAR      MONTH SALES_AMOUNT
----------- ---------- ---------- ------------
          1       2009          1     10034.84
          1       2009          2     15144.65
          1       2009          3     20137.83
          1       2009          4     25057.45
          1       2009          5     17214.56
          1       2009          6     15564.64
          1       2009          7     12654.84
          1       2009          8     17434.82
          1       2009          9     19854.57
          1       2009         10     21754.19
          1       2009         11     13029.73
          1       2009         12     10034.84
          1       2010          1     12543.55¢Ð 2009³âµµ 1¿ù 10034.84ÀÇ 1.25¹è
          1       2010          2     18930.81¢Ð 2009³âµµ 2¿ù 15144.65ÀÇ 1.25¹è
          1       2010          3     25172.29¢Ð 2009³âµµ 3¿ù 20137.83ÀÇ 1.25¹è
Model Á¶°Ç

• [dimension_condition IS] ANY

• cell_reference IS PRESENT