2012-01-10 95 views
0

要在sqlite中执行交叉表/数据透视表,可以使用case声明,如here。但是,无法对这些'生成'列进行计算,即将'Puma'列的内容除以'Fiesta'列。如何在sqlite中通过大小写进行crosstab/pivot计算?

我的解决办法一直是创建包含“彪马”和“嘉年华”列和joinview到主“交叉”的输出的辅助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

谢谢,我想我只是试过:“(CASE WHEN ...)/(CASE WHEN ...)'而不是'avg((CASE WHEN ...)/ avg(CASE WHEN ...)',就像我的情况一样不需要“平均”,“和”等。 – sseelenluft 2012-01-10 16:54:44

相关问题