2016-11-02 6 views
1

меня попросили создать отчет (с помощью функции Teradata SQL OLAP), как показано нижеразница между текущей и предыдущей колонке с использованием функций OLAP

EMPL_ID | perd_end_d | pdct_I | Year to date sal Amnt | Diff in sale amnt from Prev month 
------------------------------------------------------------------------------------------- 

я был дан следующий «продажи» набор данных, и я должен вычислить " Год до даты продажи суммы»и„разница в crrent и сумма продажи предыдущего месяца“

empl_id| perd_end_d | pdct_I|sale_amnt| 
---------------------------------------- 
E1001 | 31-01-2010 | P2003 | 2,03 | 
E1003 | 31-01-2010 | P2015 | 44  | 
E1003 | 31-01-2010 | P2004 | 67,6 | 
E1001 | 31-01-2010 | P2002 | 135  | 
E1003 | 31-01-2010 | P2003 | 545  | 
E1001 | 31-01-2010 | P2001 | 1,00 | 
E1002 | 31-01-2010 | P2005 | 23  | 
E1002 | 31-01-2010 | P2007 | 343  | 
E1006 | 28-02-2010 | P2005 | 34  | 
E1006 | 28-02-2010 | P2004 | 43  | 
E1001 | 28-02-2010 | P2003 | 54  | 
E1001 | 28-02-2010 | P2002 | 878  | 
E1003 | 28-02-2010 | P2008 | 434  | 
E1001 | 28-02-2010 | P2001 | 66  | 
E1007 | 28-02-2010 | P2009 | 455  | 
E1007 | 28-02-2010 | P2009 | 4,54 | 
E1003 | 28-02-2010 | P2007 | 56  | 
E1008 | 28-02-2010 | P2009 | 786  | 
E1010 | 31-01-2011 | P2001 | 300  | 
E1001 | 31-01-2011 | P2002 | 200  | 
E1009 | 31-01-2011 | P2003 | 100  | 
E1011 | 31-01-2012 | P2004 | 700  | 
E1002 | 31-01-2012 | P2005 | 400  | 
E1011 | 31-01-2012 | P2003 | 600  | 
E1002 | 31-01-2012 | P2007 | 500 | 
--------------------------------------- 

Я хочу что-то вроде ниже

empl_id| perd_end_d | pdct_I|sale_amnt| diff(ur_mnt_sal - prev_mnt_sal) 
------------------------------------------------------------------------- 
E1001 | 31-01-2010 | P2003 | 2,03 | 203 -- or may be null 
E1003 | 31-01-2010 | P2015 | 44  | 159 
E1003 | 31-01-2010 | P2004 | 67,6 | 632 
E1001 | 31-01-2010 | P2002 | 135  | 541 
E1003 | 31-01-2010 | P2003 | 545  | 410 
... 

До сих пор мне удалось найти нужный результат, но он выглядит уродливым, как я могу улучшить следующее решение.

SELECT perd_end_d 
    , pdct_I 
    , sale_amnt 
    , ABS(SUM(sale_amnt) over (partition by perd_end_d 
           order by perd_end_d 
           rows between 1 preceding and 1 preceding) 
     - SUM(sale_amnt) over (partition by perd_end_d 
          order by perd_end_d 
          rows current row))"prev_mnt_sal - cur_mnt_sal"        
from sandbox.sales; 

и ResultSet является следующим

enter image description here

+1

Я не могу понять, как ваш желаемый результат связан с вход. –

+0

@DuduMarkovitz упростил ваш запрос, но он по-прежнему возвращает случайные (= бесполезные) данные как «раздел» и «порядок» в том же столбце. Вы должны уточнить, что вы на самом деле пытаетесь сделать. – dnoeth

+0

@dnoeth Я немного изменил свой вопрос. Можете ли вы порекомендовать, как я должен разделять и заказывать данные? – Ali

ответ

1
SELECT perd_end_d 
    , pdct_I 
    , sale_amnt 
    , ABS(min(sale_amnt) over (partition by perd_end_d 
           order by perd_end_d 
           rows between 1 preceding and 1 preceding) 
     - sale_amnt) as "prev_mnt_sal - cur_mnt_sal"        
from sandbox.sales; 
+0

@GordonLinoff - спасибо –

+0

Я не могу выдвигать, потому что я все еще думаю, что вопрос совершенно неясен. Это определенно отвечает на «текстовую» часть вопроса, но образцы данных полностью таинственны. –

1

Чтобы, вероятно, хотите что-то вроде этого:

SELECT empl_id 
    , perd_end_d 
    , sum(sale_amnt) as sumsale 

     -- cumulative sum of sales per employee 
    , SUM(sumsale) 
     over (partition by empl_id 
      order by perd_end_d 
      rows unbounded preceding) 

     -- difference between current and previous month per employee 
    , sumsale - 
     SUM(sumsale) 
     over (partition by empl_id 
      order by perd_end_d 
      rows between 1 preceding and 1 preceding) 
from sandbox.sales 
group by 1,2;