Как сделать расчеты с помощью кросс-таблицы / сводки через case в sqlite? - PullRequest
0 голосов
/ 10 января 2012

Чтобы сделать кросс-таблицу / сводку в sqlite, можно использовать оператор case, как описано, например, здесь . Однако нельзя вычислять такие «сгенерированные» столбцы, то есть делить содержимое столбца «Puma» на столбец «Fiesta».

Мой обходной путь заключается в создании вспомогательного view, содержащего столбцы 'Puma' и 'Fiesta' и join this view к основному выходу 'crosstab' и разделения столбцов из объединенной вспомогательной таблицы.

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;

Но мне интересно, есть ли более простой способ сделать это.

1 Ответ

2 голосов
/ 10 января 2012

Вы всегда можете просто снова сделать суммы, например:

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
...