Oracle / SQL - динамические столбцы на основе параметра - PullRequest
0 голосов
/ 01 ноября 2018

, поэтому я пытаюсь построить модель данных для отчета о численности персонала, которая позволяет пользователю выбрать то, по чему он хочет рассчитывать численность персонала (динамический столбец). Я попытался запросить скрипт ниже (это всего лишь пример, у реального скрипта есть несколько подсчетов и процентов), и система застревает при обработке, как в цикле. Мой список значений варьируется от 1 до 5. Я также попытался составить фиксированный список значений и поместить запросы для столбца группировки в значения, что также привело к бесконечной обработке. Есть идеи?

(SELECT test1.test1,
    COUNT(DISTINCT id.personid)
    FROM
    table_identifiers id,
    (SELECT DISTINCT
    (CASE WHEN :P_COLUMN = 1 THEN te.ethnicities
    WHEN :P_COLUMN = 2 THEN tc.companyname
    ELSE NULL END) AS test1
    FROM
    table_ethnicities te,
    table_companies tc
    WHERE 1=1

    ) test1
    GROUP BY test1.test1)

1 Ответ

0 голосов
/ 01 ноября 2018

Ну, с первого взгляда у вас есть декартово объединение в вас самое большее внутренний test1 запрос

FROM
    table_ethnicities te,
    table_companies tc
    WHERE 1=1

Затем у вас есть второе объединение ласкать между запросами table_identifiers и test1 .

FROM
    table_identifiers id,(
...
) test1
    GROUP BY test1.test1)

Так что это потенциальная причина низкой производительности этого запроса.

Для решения проблемы в запросе test1 я предлагаю использовать оператор UNION ALL, например:

(SELECT test1.test1,
    COUNT(DISTINCT id.personid)
    FROM
    table_identifiers id,
    (SELECT DISTINCT te.ethnicities AS test1
          FROM table_ethnicities te
          WHERE :P_COLUMN = 1
     UNION ALL
     SELECT DISTINCT tc.companyname 
          FROM table_companies tc
          WHERE :P_COLUMN = 2
    ) test1
    GROUP BY test1.test1)

Чтобы исправить второе декартово соединение, вы должны добавить условие соединения.

...