首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多列中的不同值中计数

从多列中的不同值中计数
EN

Stack Overflow用户
提问于 2018-12-11 16:17:51
回答 2查看 80关注 0票数 0

如果之前有人问过这个问题,我很抱歉,我没能找到这样的问题/解决方案,然后再分解和发布。下面的查询(使用Oracle SQL)在某种意义上运行良好,但并不完全符合我所要寻找的内容。

代码语言:javascript
复制
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列的逻辑:

  • order_date的计数(srt_level = 80 + 100 +迟)“延迟”计数需要添加到总数中,只是不显示

我最终将添加一个filled_orders列,它将位于total_orders列之前,但我只是还没有到那里。

抱歉我之前没那么描述。再次感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-12-11 16:31:37

您似乎不需要子查询;如果您想要每个值组合的计数,然后按这些值分组,并在该级别进行聚合;如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-12-12 20:50:35

我把它发挥到了我问题的程度。只需要在每一列中嵌套计数/计算。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53728229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档