2016-04-27 9 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 | 
+-------------------------------+----------------+ 

しかし、顧客名ごとに2つの値を正しく分割するクエリを見つけることはできません。

答えて

0

あなたが選ぶためにSUM(CASE)、その後、顧客ごとに1つの行を取得するにはGROUP BYを使用することができます現在値と前の値

これは、結合を必要とするのではなく、テーブルを1回スキャンするという利点があります。

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

++ ..!どうぞ[this](http://stackoverflow.com/questions/36897213/how-can-i-break-selecting-when-condition-is-false)をご覧ください。 – stack

関連する問題