COUNT из значений DISTINCT в нескольких столбцах - PullRequest
0 голосов
/ 11 декабря 2018

Если об этом уже спрашивали, прошу прощения, я не смог найти такой вопрос / решение, как это, до того, как разобрать и опубликовать.У меня есть запрос ниже (с использованием Oracle SQL), который в некотором смысле работает нормально, но не полностью, что я ищу.

SELECT
    order_date,
    p_category,
    CASE
        WHEN ( issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END AS issue_group,
    srt   AS srt_level,
    COUNT(*) AS total_orders
FROM
    database.t_con
WHERE
    order_date IN (
        '&Enter_Date_YYYYMM'
    )
GROUP BY
    p_category,
    CASE
        WHEN ( issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END,
    srt,
    order_date
ORDER BY
    p_category,
    issue_group,
    srt_level,
    order_date

Текущий доход (12 строк):

enter image description here

Требуется возврат (8 строк без отображаемых строк):

enter image description here

Вот логика столбца total_order, которую я ожидаю:

  • count order_date где (srt_level =80 + 100 + Поздно) ... Необходимо добавить «поздние» отсчеты к итогу, просто не будут отображаться

Я в конечном итоге добавляю столбец fill_orders, который будет идти перед столбцом total_orders,но я просто еще не там.

Извините, я не был так описателен раньше.Еще раз спасибо!

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я понял, что это работает в той степени, в какой был мой вопрос.Просто нужно было вложить каждый столбец, где происходили подсчеты / расчеты.

SELECT
    order_date,
    p_category,
    issue_group,
    srt_level,
    order_count,
    SUM(order_count) OVER(
        PARTITION BY order_date, issue_group, p_category
    ) AS total_orders
FROM
    (
        SELECT
            order_date,
            p_category,
            CASE
                WHEN ( issue_grp = 1 ) THEN '1'
                ELSE '2/3 '
            END AS issue_group,
            srt   AS srt_level,
            COUNT(*) AS order_count
        FROM
            database.t_con
        WHERE
            order_date IN (
                '&Enter_Date_YYYYMM'
            )
        GROUP BY
            p_category,
            CASE
                WHEN ( issue_grp = 1 ) THEN '1'
                ELSE '2/3 '
            END,
            srt,
            order_date
    )
ORDER BY
    order_date,
    p_category,
    issue_group
0 голосов
/ 11 декабря 2018

Вам не нужен подзапрос;если вы хотите подсчитать для каждой комбинации значений, группируйте их и агрегируйте на этом уровне;что-то вроде:

SELECT
    t1.order_date,
    t1.p_category,
    CASE
        WHEN ( t1.issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END AS issue_group,
    t1.srt AS srt_level,
    COUNT(*) AS total_orders
FROM
    database.t_con t1
WHERE
    t1.order_date = TO_DATE ( '&Enter_Date_YYYYMM', 'YYYYMM' )
GROUP BY
    t1.p_category,
    CASE
        WHEN ( t1.issue_grp = 1 ) THEN '1'
        ELSE '2/3 '
    END,
    t1.srt,
    t1.order_date
ORDER BY
    p_category,
    issue_group,
    srt_level,
    order_date;

Вы не должны полагаться на неявное преобразование и настройки NLS для аргумента даты (предполагая, что order_date на самом деле столбец даты, а не строка), поэтому я использовалявный TO_DATE() вызов, используя формат, предложенный вашим именем и приглашением переменной замещения.

Однако, это даст вам первый день указанного месяца, так как номер дня не указан.Скорее всего, вы либо захотите запросить полную дату, либо (возможно) только год / месяц, но захотите включить все дни в этом месяце, чего не будет делать IN(), если это было вашим намерением.Это также подразумевает, что все сохраненные даты имеют свои временные интервалы, установленные на полночь, поскольку это все, что будет соответствовать.Если эти значения имеют значения, не относящиеся к полуночи, то вам также нужен диапазон для их получения.

...