[英]COUNT from DISTINCT values in multiple columns
抱歉,如果您以前曾提出过此问题,请在分解和发布之前找不到类似的问题/解决方案。 我有以下查询(使用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列的逻辑:
我最终要添加一个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;
您不应该依赖于date参数的隐式转换和NLS设置(假设order_date
实际上是日期列,而不是字符串),所以我使用了显式的TO_DATE()
调用,使用了替换变量建议的格式名称和提示。
但是,这将为您提供所提供月份的第一天,因为没有提供日期编号。 您更有可能想要提示一个完整的日期,或者(可能)仅提示年/月,但想要包括该月的所有天数-如果您打算这样做,则IN()
不会这样做。 这也意味着存储的日期都将其时间部分设置为午夜,因为这将与之匹配。 如果这些值具有非午夜时间,那么您也需要一个范围来选择这些值。
在我的问题范围内,我得到了它的解决。 只需要嵌套发生计数/计算的每一列。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.