2016-04-27 185 views
1

我试图衡量一些销售数据随时间的增长。我组的电流和以前一起销售基于最后N个月,得到以下(略)表:基于其他列值划分列值

+-------------------------------+---------------+-------------+ 
| CUSTOMER_NAME     | TIMEFRAME  | GROSS_SALES | 
+-------------------------------+---------------+-------------+ 
| SALLY'S SALES INC    | CURRENT  |  1207.76 | 
| SALLY'S SALES INC    | PREVIOUS  |  8139.49 | 
| DAVES PRODUCTS LLC   | CURRENT  |  909.92 | 
| DAVES PRODUCTS LLC   | PREVIOUS  |  2867.41 | 
| MEGACORP      | CURRENT  |  8369.05 | 
| MEGACORP      | PREVIOUS  | 19123.75 | 
+-------------------------------+---------------+-------------+ 

我试图计算当前和以前的销售之间的商,像

+-------------------------------+----------------+ 
| CUSTOMER_NAME     | SALES_FACTOR | 
+-------------------------------+----------------+ 
| SALLY'S SALES INC    | 0.148382761082 | 
| DAVES PRODUCTS LLC   | 0.317331668649 | 
| MEGACORP      | 0.690302092999 | 
+-------------------------------+----------------+ 

但是,我无法弄清楚正确地将每个客户名称的两个值分开的查询。

回答

0

您可以使用GROUP BY每个客户得到一排,然后SUM(CASE)挑出来当前和以前的值。

这样做的好处是只扫描一次表格而不需要连接。

SELECT 
    CUSTOMER_NAME, 
    SUM(CASE WHEN TIMEFRAME = 'CURRENT' THEN GROSS_SALES END) 
/
    SUM(CASE WHEN TIMEFRAME = 'PREVIOUS' THEN GROSS_SALES END) AS SALES_FACTOR 
FROM 
    yourTable 
GROUP BY 
    CUSTOMER_NAME 
+0

完美 - 谢谢! –

0

用不同的名称使用表两次......

select CUSTOMER_NAME, t1.TIMEFRAME/t2.TIMEFRAME 
    from TABLE_NAME as t1, TABLE_NAME as t2 
where t1.CUSTOMER_NAME = t2.CUSTOMER_NAME 
    and t1.TIMEFRAME = 'PREVIOUS' 
    and t2.TIMEFRAME = 'CURRENT' 
0

一种方法是使用有条件聚集:

select customer_name, 
     (max(case when time_frame = 'Current' then gross_sales end)/
     max(case when time_frame = 'Previous' then gross_sales end) 
     ) as ratio 
from t 
group by customer_name; 
+0

++ ..!请你看看[这个](http://stackoverflow.com/questions/36897213/how-can-i-break-selecting-when-condition-is-false)? – stack