Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从多列中的不同值计数_Sql_Oracle_Count_Distinct - Fatal编程技术网

Sql 从多列中的不同值计数

Sql 从多列中的不同值计数,sql,oracle,count,distinct,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, C

如果以前有人问过这个问题,我很抱歉,在我崩溃并发布之前,我找不到类似的问题/解决方案。我有以下使用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行,但不显示tan行:

下面是我期望的total_order列的逻辑:

srt\U级别=80+100+延迟的订单日期计数…'需要将“延迟”计数添加到总数中,但不能显示 我最终添加了一个filled_orders列,该列将位于total_orders列之前,但我还没有做到这一点


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

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

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;
假设order\u date实际上是一个日期列,而不是字符串,则不应该依赖日期参数的隐式转换和NLS设置,因此我使用了一个显式的TO\u date调用,使用替换变量名和提示符建议的格式


但是,这将为您提供所提供月份的第一天,因为没有提供天数。更可能的情况是,您要么希望提示完整日期,要么可能只是年/月,但希望包括该月的所有天数——如果您有意的话,这在中是不行的。它还意味着存储的日期都将其时间部分设置为午夜,因为这是它将匹配的全部时间。如果这些值不是午夜时间,那么您也需要一个范围来提取这些值。

我让它工作到了我的问题的程度。只需要嵌套正在进行计数/计算的每个列

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

我认为这个答案符合您的要求:。向我们展示db模式、示例数据、当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。分析函数在这方面也可以帮助您。按p_类别、问题组、srt_级别划分的分区计数*?用于独立于查询中的分组进行计数。但我不完全理解您的问题/疑问,因此这可能是离题的。样本数据和预期结果将对您有所帮助。更新。。。很抱歉更新了我的查询,它当前正在运行。。。将在完成后更新。不幸的是,order_date列存储为varchar2而不是date。我问这是为什么,但还没有给出一个明确的答案。好吧,那就忽略我想的关于约会的一点吧。。。正如上面所评论的,样本数据等会让事情变得更清楚。你的更新在一定程度上起到了作用,我将在上面做更多解释。我必须等待查询完成运行,然后才能获取样本数据。我将随时更新新内容。谢谢