Как рассчитать процент в PIVOT - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь рассчитать процент типа транспортных средств на департамент в сводной таблице. Я сделал это со счетом:

    SELECT
    *
FROM
    (
    SELECT
        CASE
            WHEN TYPE_V = 'N1' THEN 'CAR'
            WHEN TYPE_INCIDENT IN ('N2',
            'N3') THEN 'BUS'
        END TYPE_VEH,
        DEPARTEMENT
    FROM
        DWH
    WHERE
        CODE = 'YES' ) PIVOT (COUNT(DEPARTEMENT)FOR DEPARTEMENT IN ('D1' AS D1,
    'D2' AS D2,
    ) )

Результат:

===========================
TYPE_VEH        D1      D2
===========================
    CAR        2        8
    BUS        2        2

То, что я хочу, это:

===========================
TYPE_VEH        D1      D2
===========================
    CAR        20%      80%
    BUS        50%      50% 

Ответы [ 4 ]

1 голос
/ 03 июля 2019

Вы можете использовать

SELECT TYPE_VEH, D1 / (D1+D2) as D1, D2 / (D1+D2) as D2 FROM ...

вместо

SELECT * FROM
0 голосов
/ 03 июля 2019

Я бы просто использовал условную агрегацию:

SELECT TYPE_VEH,
       AVG(CASE WHEN DEPARTMENT = 'D1' THEN 100.0 ELSE 0 END) as D1,
       AVG(CASE WHEN DEPARTMENT = 'D2' THEN 100.0 ELSE 0 END) as D2
FROM (SELECT (CASE WHEN TYPE_V = 'N1' THEN 'CAR'
                   WHEN TYPE_INCIDENT IN ('N2', 'N3') THEN 'BUS'
              END) AS TYPE_VEH,
              DWH.*
      FROM DWH
      WHERE CODE = 'YES'
     ) D
GROUP BY TYPE_VEH;

Обычно вы хотите, чтобы это значение было числом . Но если вы хотите, чтобы он был отформатирован в виде строки, вы можете отобразить процентное время, используя || '%'.

0 голосов
/ 03 июля 2019

Вам нужно aggregation, чтобы получить проценты, я предлагаю вам использовать функцию анализа окна, чтобы получить агрегацию в подзапросе без необходимости группировки.

SELECT TYPE_VEH, ( D1 / TOT ) * 100||'%' AS D1, ( D2 / TOT ) * 100||'%' AS D2               
  FROM (SELECT CASE
                 WHEN TYPE_V = 'N1' THEN
                  'CAR'
                 WHEN TYPE_INCIDENT IN ('N2', 'N3') THEN
                  'BUS'
              END TYPE_VEH,
              DEPARTMENT,
              COUNT(*) OVER (PARTITION BY CASE WHEN TYPE_V = 'N1' THEN 1 ELSE 0 END 
                             ORDER BY 1) TOT
         FROM DWH
        WHERE CODE = 'YES') 
 PIVOT(COUNT(DEPARTMENT) FOR DEPARTMENT IN('D1' AS D1,'D2' AS D2));

Демо

0 голосов
/ 03 июля 2019

Я предполагаю, что вам даже не нужен PIVOT для этого.

Вы можете напрямую получить этот вывод из таблицы DW_DECSI2.DWH_DSI_F_PLAN_PERFORMANCE следующим образом:

SELECT
    DEPARTEMENT,
    (D1 * 100) / ( D1 + D2 ) || '%' AS D1,
    (D2 * 100) / ( D1 + D2 ) || '%' AS D2
FROM
    (
        SELECT
            DEPARTEMENT,
            SUM(CASE
                WHEN TYPE_V = 'N1' THEN 1
                ELSE 0
            END) AS D1,
            SUM(CASE
                WHEN TYPE_V <> 'N1'
                     AND TYPE_INCIDENT IN(
                    'N2', 'N3'
                ) THEN 1
                ELSE 0
            END) AS D2
        FROM
            DW_DECSI2.DWH_DSI_F_PLAN_PERFORMANCE
        WHERE
            CODE = 'YES'
        GROUP BY
            DEPARTEMENT
    );

Cheers !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...