在Oracle SQL中,如何查询具有特定值的记录的比例?
比如说,你有一个这样的疑问在Oracle SQL中,如何查询具有特定值的记录的比例?,sql,database,oracle11g,Sql,Database,Oracle11g,比如说,你有一个这样的疑问 SELECT COUNT(*), date FROM ORDERS GROUP BY date ORDER BY date 但您还希望有第三个“幻影/虚拟字段”,它基本上告诉您每天特定类型订单的分数(比如“餐具”和“易腐物品”) 我应该说ORDERS表中还有一列包含订单类型: order_type 第三个虚拟列应该做一些类似于计算某一日期具有“餐具”或“易腐品”类型(不是XOR)的订单数量,然后除以该日期的订单总数,然后四舍五入到小数点后2位,并附加一个百分号 最
SELECT COUNT(*), date FROM ORDERS GROUP BY date ORDER BY date
但您还希望有第三个“幻影/虚拟字段”,它基本上告诉您每天特定类型订单的分数(比如“餐具”和“易腐物品”)
我应该说ORDERS表中还有一列包含订单类型:
order_type
第三个虚拟列应该做一些类似于计算某一日期具有“餐具”或“易腐品”类型(不是XOR)的订单数量,然后除以该日期的订单总数,然后四舍五入到小数点后2位,并附加一个百分号
最后几个格式化的事情并不重要……我真正需要知道的是如何在有效的PLSQL语法中应用逻辑
示例输出
4030 2012-02-02 34.43%
4953 2012-02-03 16.66%
你可以这样做
SELECT COUNT(*),
dt,
round( SUM( CASE WHEN order_type = 'Utensils'
THEN 1
ELSE 0
END) * 100 / COUNT(*),2) fraction_of_utensils_orders
FROM ORDERS
GROUP BY dt
ORDER BY st
如果你觉得更容易理解,你也可以
SELECT COUNT(*),
dt,
round( COUNT( CASE WHEN order_type = 'Utensils'
THEN 1
ELSE NULL
END) * 100/ COUNT(*), 2) fraction_of_utensils_orders
FROM ORDERS
GROUP BY dt
ORDER BY st
要将相同类型的订单之和添加到查询中,请执行以下操作:
select
o.*,
(
select count(o2.OrderType)
from ORDERS o2
where o2.OrderType = o.OrderType
) as NumberOfOrdersOfThisType
from ORDERS o
向查询中添加相同类型订单的分数:(检查变量定义以确保它是PL/SQL)
您能给出一个输出示例吗?如果我在PL/SQL中没有弄错,您将不得不使用DECODE而不是CASE。@DannyVarod-
CASE
在PL/SQL中有效(尽管语法与SQL中的语法有点不同)。但我们目前实际上并没有谈论PL/SQL——这似乎是一个严格意义上的SQL问题。问题标题和标签上写着PLSQL。@Wuschelbuetelkartofelhuhn-视情况而定。企业管理器、SQL开发人员和SQL*Plus最有可能的组合。@Wuschelbeutelkartofelhuhn这属于一个单独的问题,但是,有很多问题。Oracle的免费工具称为“Oracle SQL Developer”。
declare totalCount number
select count(*)
into totalCount
from ORDERS
select
o.*,
(
select count(o2.OrderType)
from ORDERS o2
where o2.OrderType = o.OrderType
) / totalCount as FractionOfOrdersOfThisType
from ORDERS o