【问题标题】:COUNT from DISTINCT values in multiple columnsCOUNT 来自多列中的 DISTINCT 值
【发布时间】:2018-12-11 16:17:51
【问题描述】:

如果以前有人问过这个问题,我很抱歉,在分解和发布之前我无法找到类似的问题/解决方案。我有以下查询(使用 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 行):

需要返回(8 行不显示棕褐色行):

这是我期望的 total_order 列的逻辑:

  • count of order_date where (srt_level = 80 + 100 + Late) ... 'Late' 计数需要添加到总数中,只是不显示

我最终会添加一个 Filled_orders 列,该列将位于 total_orders 列之前,但我还没有到那里。

抱歉,我之前的描述性不强。再次感谢!

【问题讨论】:

  • 我认为这个答案有你想要的:stackoverflow.com/questions/1521605/…
  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example
  • 分析函数在这里也可以为您提供帮助。 count(*) over (Partition by p_category, issue_group, srt_level)?使您可以独立于查询中的分组进行计数。但我不完全理解你的问题/查询,所以这可能是错误的。示例数据和预期结果将大有帮助。
  • 更新了……抱歉!

标签: sql oracle count distinct


【解决方案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() 不会这样做。这也意味着存储的日期都将其时间部分设置为午夜,因为这就是它将匹配的所有内容。如果这些值有非午夜时间,那么您也需要一个范围来获取它们。

【讨论】:

  • 更新了我的查询,它目前正在运行...完成后会更新。不幸的是 order_date 列存储为 varchar2 而不是日期。我问为什么会这样,但还没有给出明确的答案。
  • 好吧,然后忽略关于to_date() 的部分我想......正如上面评论的那样,示例数据等会让事情变得更清晰。
  • 您的更新在一定程度上有效,我将在上面进行更多解释。在获取示例数据之前,我必须等待查询完成运行。我将随时更新添加内容。谢谢!
【解决方案2】:

我让它在我的问题范围内发挥作用。只需要嵌套发生计数/计算的每一列。

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

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2021-11-06
    • 1970-01-01
    • 2013-05-12
    • 2020-10-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多