Sql 从多列中的不同值计数
如果以前有人问过这个问题,我很抱歉,在我崩溃并发布之前,我找不到类似的问题/解决方案。我有以下使用Oracle 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
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。我问这是为什么,但还没有给出一个明确的答案。好吧,那就忽略我想的关于约会的一点吧。。。正如上面所评论的,样本数据等会让事情变得更清楚。你的更新在一定程度上起到了作用,我将在上面做更多解释。我必须等待查询完成运行,然后才能获取样本数据。我将随时更新新内容。谢谢