多个列中DISTINCT个值中的COUNT个

时间:2018-12-11 16:17:51

标签: sql oracle count distinct

如果以前曾问过这个问题,对不起,我无法在分解和发布之前找到类似的问题/解决方案。我有以下查询(使用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列的逻辑:

  • order_date的数量,其中(srt_level = 80 + 100 + Late)...需要将“最新”计数添加到总数中,只是不显示

我最终要添加一个filled_orders列,该列将位于total_orders列之前,但是我还没有。

对不起,我之前没有这么描述。再次感谢!

2 个答案:

答案 0 :(得分:1)

您似乎不需要子查询;如果您想要每个值组合的计数,则将其分组,并在该级别进行汇总;像这样:

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()则不会。这也意味着存储的日期都将其时间部分设置为午夜,因为这将与之匹配。如果这些值具有非午夜时间,那么您也需要一个范围来获取这些值。

答案 1 :(得分:0)

在我所提出的问题范围内,它可以正常工作。只需要嵌套发生计数/计算的每一列。

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