在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