Chinaunix

标题: 这样的sql怎么写!求两个sql的比! [打印本页]

作者: linetech    时间: 2008-03-13 15:36
标题: 这样的sql怎么写!求两个sql的比!
select count from 端口 where related_dev_uuid="AA"

select count from 端口 where related_dev_uuid="AA" and port_status="占用"


怎么写一个sql能求出来这两个值比。谢谢!
作者: ahqkxfer    时间: 2008-03-13 15:40
你把字段不是"占用“的值得到不就可以了吗?
select * from 表 where 字段 <>"占用"
作者: linetech    时间: 2008-03-13 15:46
我是想用占用的除以全部的结果。
作者: linetech    时间: 2008-03-13 15:51
select count from 端口 where related_dev_uuid="AA"/select count from 端口 where related_dev_uuid="AA" and port_status="占用"     的结果
作者: xjfirst    时间: 2008-03-13 18:26
select count / (select count from 端口 where related_dev_uuid= A.related_dev_uuid)  from 端口 A where related_dev_uuid="AA" and port_status="占用"
作者: ivhb    时间: 2008-03-13 19:17
原帖由 linetech 于 2008-3-13 15:36 发表
select count from 端口 where related_dev_uuid="AA"

select count from 端口 where related_dev_uuid="AA" and port_status="占用"


怎么写一个sql能求出来这两个值比。谢谢!


select
   sum (
      case when  related_dev_uuid="AA" and port_status="占用" then 1 else 0 end
    ) / sum (
      case when where related_dev_uuid="AA"  then 1 else 0 end
    )
from 端口
;
作者: ivhb    时间: 2008-03-13 19:18
当然,你需要考虑分母是0的情况。
所以更加复杂的写法。。。。
稍微的扩展一下,就可以得到。你不妨一试。
作者: linetech    时间: 2008-03-14 22:05
非常感谢,我明天试试。
作者: kenshin0506    时间: 2008-03-14 23:25
原帖由 ivhb 于 2008-3-13 19:17 发表


select
   sum (
      case when  related_dev_uuid="AA" and port_status="占用" then 1 else 0 end
    ) / sum (
      case when where related_dev_uuid="AA"  then 1 else 0 end
    )
from  ...


decode 一下比这个容易~~
作者: linetech    时间: 2008-03-17 10:27
楼上的能说的具体些吗?谢谢!
作者: ivhb    时间: 2008-03-17 13:29
这个逻辑还算是简单,用decode会让代码看起来简洁些,
但是一般来说,decode的可读性会比较差
作者: blackuhlan    时间: 2008-03-24 12:33
select sum( decode( port_status, "占用",1,0))/count(*) from 端口 where
related_dev_uuid="AA"
作者: liaosnet    时间: 2008-03-24 16:00
标题: DECODE的用法..
DECODE 表达式和 CASE 表达式类似,它能根据指定列中找到的值打印不同的结果。

阅读语法图跳过直观语法图DECODE 函数:

                       .-,---------------------------.
                       V                             |  .-,--NULL------.
|--DECODE--(--expr--,----when_expr--,--+-then_expr-+-+--+--------------+--)--|
                                       '-NULL------'    '-,--else_expr-'


元素         描述         限制         语法
expr, else_expr,
then_expr,
when_expr         值和数据类型可以评估的表达式         when_expr 和 expr 的数据类型必须一致,then_expr 和 else_expr 的数据类型也必须一致。when_expr 的值不能是 NULL。         表达式,
表达式页

表达式 expr、when_expr 和 then_expr 是必需的。DECODE 对 expr 求值并把它和 when_expr 比较。如果 when_expr 的值和 expr 的值匹配,那么 DECODE 返回 then_expr。

表达式 when_expr 和 then_expr 是一个表达式对,可以在 DECODE 函数中指定任意数量的表达式对。在所有情况下,DECODE 把表达式对中的第一个成员和 expr 进行比较,如果第一个成员和 expr 匹配,就返回第二个成员。

如果没有表达式和 expr 匹配,DECODE 就返回 else_expr。如果没有表达式和 expr 匹配而且没有指定 else_expr,那么 DECODE 返回 NULL。

可以为参数指定任何数据类型,但是有两个限制:

    * 所有 when_expr 的实例必须有相同的数据类型,或者必须存在一个公共兼容类型。所有 when_expr 的实例也必须具有和 expr 相同(或兼容)的数据类型。
    * 所有 then_expr 的实例必须有相同的数据类型,或者必须存在一个公共兼容类型。所有 then_expr 的实例也必须具有和 else_expr 相同(或兼容)的数据类型。

假设一个用户要把 students 表 evaluation 列的描述值在输出中转换成数字值。下表给出了 students 表的内容。
firstname         evaluation                 firstname         evaluation
Edward         Great                 Mary         Good
Joe         Not done                 Jim         Poor

现在用户输入带有 DECODE 函数的查询,将 evaluation 列中的描述性值转换为相等的数字值:

SELECT firstname, DECODE(evaluation,
   'Poor', 0,
   'Fair', 25,
   'Good', 50,
   'Very Good', 75,
   'Great', 100,
   -1) as grade
FROM students

下表给出了这个 SELECT 语句的输出。
firstname         evaluation                 firstname         evaluation
Edward         100                 Mary         50
Joe         -1                 Jim         0
常量表达式

返回一个固定值的确定表达式称为常量表达式。其中有以下的运算符(或系统常量),它们的返回值在运行时就已确定:

    * CURRENT 从系统时钟返回当前的时间和日期:
    * CURRENT_ROLE 返回角色名称(如果有的话),该角色的特权已对当前用户启用。
    * CURRENT_ROLE 返回角色名称(如果有的话),该角色是当前用户的缺省角色。
    * DBSERVERNAME 返回当前数据库服务器名。
    * SITENAME 是 DBSERVERNAME 的同义词。
    * TODAY 从系统时钟返回当前日历日期。
    * USER 返回当前用户的登录名(也称为授权标识符)。

除了这些运算符之外,术语常量表达式还可指带引号字符串、文字值或带有操作数的 UNITS 运算符。

常量表达式具有下列语法。

阅读语法图跳过直观语法图常量表达式:

                       (1)
|--+-| Quoted String |------------------------------------------------+--|
   |                    (2)                                           |
   +-| Literal Number |-----------------------------------------------+
   +-+-USER---------------------------+-------------------------------+
   | |  (3)    (4)                    |                               |
   | '---------------+-CURRENT_ROLE-+-'                               |
   |                 '-DEFAULT_ROLE-'                                 |
   |  (4)                                                             |
   '------+-+-SITENAME-----+----------------------------------------+-'
          | '-DBSERVERNAME-'                                        |
          +-TODAY---------------------------------------------------+
          +-CURRENT--+------------+---------------------------------+
          |          '- precision-'                                 |
          |                      (5)                                |
          +-| Literal DATETIME |------------------------------------+
          |                      (6)                                |
          +-| Literal INTERVAL |------------------------------------+
          +-num--UNITS--time_unit-----------------------------------+
          |  (3)                                                    |
          '------+-+------------+--+- sequence-+-- .--+-CURRVAL-+-+-'
                 | '- owner-- .-'  '- synonym--'      '-NEXTVAL-' |
                 |                        (7)                     |
                 +-| Literal Collection |-------------------------+
                 |                 (8)                            |
                 +-| Literal Row |--------------------------------+
                 +-literal opaque type----------------------------+
                 '-literal BOOLEAN--------------------------------'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2