2012-01-10 66 views
0

sqliteでクロスタブ/ピボットを行うには、hereのようにcaseステートメントを使用できます。しかし、そのような「生成された」列、すなわち「Puma」列の内容を「Fiesta」列で割り算することはできません。sqliteのcaseを介してクロス集計/ピボットを使用した計算を行う方法は?

私の問題を回避するには、メイン「クロス集計」出力に「ピューマ」と「フィエスタ」列とjoinこのviewを含む補助viewを作成し、参加補助テーブルからの列を分割することでした。

CREATE VIEW aux_table AS SELECT 
    shop_id, 
    sum(CASE WHEN product = 'Fiesta' THEN units END) as Fiesta, 
    sum(CASE WHEN product = 'Focus' THEN units END) as Focus` 
FROM sales 
GROUP BY shop_id; 

SELECT 
    shop_id, 
    sum(CASE WHEN product = 'Fiesta' THEN units END) as Fiesta, 
    sum(CASE WHEN product = 'Focus' THEN units END) as Focus, 
    sum(CASE WHEN product = 'Puma' THEN units END) as Puma, 
    at.Fiesta/at.Focus 'ratio between Fiesta and Focus' 
FROM sales 
JOIN aux_table at ON 
    sales.shop_id = at.shop_id 
GROUP BY shop_id; 

しかし、私はこれを行う簡単な方法があるのだろうかと思います。

答えて

2

あなたはいつもちょうどそのように、再度、合計を行うことができます。

SELECT 
    shop_id, 
    sum(CASE WHEN product = 'Fiesta' THEN units END) as Fiesta, 
    sum(CASE WHEN product = 'Focus' THEN units END) as Focus, 
    sum(CASE WHEN product = 'Puma' THEN units END) as Puma, 
    sum(CASE WHEN product = 'Fiesta' THEN units END)/sum(CASE WHEN product = 'Focus' THEN units END) as Ratio 
FROM sales 
GROUP BY shop_id 

あるいは、より速く、あなたはこのように、サブクエリでそれを包むことができます。

select 
    shop_id, 
    Fiesta, 
    Focus, 
    Puma, 
    Fiesta/Focus as Ratio 
from 
    (
    SELECT 
     shop_id, 
     sum(CASE WHEN product = 'Fiesta' THEN units END) as Fiesta, 
     sum(CASE WHEN product = 'Focus' THEN units END) as Focus, 
     sum(CASE WHEN product = 'Puma' THEN units END) as Puma 
    FROM sales 
    GROUP BY shop_id 
    ) x 
+0

私は推測するおかげで、私の場合と同じように 'avg((CASE WHEN ...)/ AVG(CASE WHEN ...)')ではなく '(CASE WHEN ...)/ 'avg'、' sum'などは必要ありません。 – sseelenluft

関連する問題