/*
Navicat Oracle Data Transfer
Oracle Client Version : 10.2.0.1.0Source Server : 192.168.1.99
Source Server Version : 100200
Source Host : 192.168.1.99:1521
Source Database :  
Source Schema : STBMTarget Server Type : ORACLE
Target Server Version : 100200
File Encoding : 65001Date: 2010-10-25 11:02:58
*/
数据表结构
DROP TABLE "POWER_ONOFF";  CREATE TABLE "STBM"."POWER_ONOFF"  
  ( "MAC_ADDR" CHAR(12) NOT NULL ENABLE,  
"TIME" DATE NOT NULL ENABLE,  
"TYPE" NUMBER(3,0),  
"IP" VARCHAR2(16),  
"CHECKED" NUMBER(3,0)
  ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "STB"  
 ;表的信息内容:
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-25 10:33:13', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-23 10:19:18', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-23 10:24:36', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-23 13:44:34', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-23 15:22:30', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-25 10:26:36', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-25 10:30:50', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-23 15:52:08', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b8', TO_DATE('2010-10-23 16:11:53', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b8', TO_DATE('2010-10-23 16:18:02', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-25 09:31:25', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b8', TO_DATE('2010-10-23 15:42:37', 'YYYY-MM-DD HH24:MI:SS'), '1', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b8', TO_DATE('2010-10-23 15:48:11', 'YYYY-MM-DD HH24:MI:SS'), '1', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b9', TO_DATE('2010-10-25 10:15:45', 'YYYY-MM-DD HH24:MI:SS'), '1', '192.168.1.74', null);
INSERT INTO "POWER_ONOFF" VALUES ('001d080000b8', TO_DATE('2010-10-23 10:08:55', 'YYYY-MM-DD HH24:MI:SS'), '0', '192.168.1.74', null);目前我要写一个语句,查询出状态是开机的机器在所有机器(开机和为开机都有)中所占的比例。目前,表中的结构只能用TIME做条件判断来确定是否是开机
如下语句语句可以查处开机的机器数量
select count(distinct power_onoff.mac_addr) from power_onoff,(select mac_addr,max(time)) t1 from power_onoff where time<=TO_DATE('2010-10-25''YY-MM-DD') group by mac_addr) a where power_onoff.mac_addr and power_onoff.time=a.t1 and power_onoff.type='0'
解释一下,distinct power_onoff.mac_addr这个语句可以不用深入去想,不是关键因素。
  关机的个数正好相反
select count(distinct power_onoff.mac_addr) from power_onoff,(select mac_addr,max(time)) t1 from power_onoff where time>TO_DATE('2010-10-25''YY-MM-DD') group by mac_addr) a where power_onoff.mac_addr and power_onoff.time=a.t1 and power_onoff.type='0'or power_onoff.type='1'我只会写简单的sql图表比例的语句。
如下:select MANUFACTURE_TYPE ,coun(MANUFACTURE_TYPE) from STB_DEVICE group by MANUFACTURE_TYPE 、
 这是一个简单基础的语句结构;查询某个机器类型在所有机器类型中所占的比例。coun(MANUFACTURE_TYPE)相当于分母,group by MANUFACTURE_TYPE相当于分子。这样就可以用图表插件显示出比例了。
可是上面的这个我就不懂得如何套用模式了,因为就根据TIME这个字段讲当前开机的机器都查出来就已经很多了的语句了,我不会在套用在上面这种模式的图表生成的sql语句中了

解决方案 »

  1.   


    --不知道需求是不是这样的:SELECT mac_addr,
    Round(Sum(CASE WHEN time<=TO_DATE('2010-10-25','YY-MM-DD') THEN 1 ELSE 0 END)/Count(1)*100,2)||'%' 开机比例,
    Round(Sum(CASE WHEN time >TO_DATE('2010-10-25','YY-MM-DD') THEN 1 ELSE 0 END)/Count(1)*100,2)||'%' 关机比例
    FROM power_onoff 
    GROUP BY mac_addr ;MAC_ADDR       开机比例   关机比例
    --------------------------------------
    001d080000b8    100%        0% 
    001d080000b9    50%         50%
      

  2.   

    不是具体到哪个mac地址的机器的开关机比例,而是所有机器,无论地址是否一样的开关机比例,地址一样的,都是开机的,取大于当前时间的最大时间值的机器。
    比如说:如果地址是00ld080000b8的机器,属于这个地址的机器,比如当前时间是2010-10-25 10:00:00,如果开机时间是2010-10-25 10:20:20,有开机时间是2010-10-25 10:30:30,类似于这样的同地址不同时间的机器,则取时间最大的那个数据2010-10-25 10:30:30,说明是开机的,则地址是00ld080000b8是开机的,是1条数量。同理,地址是00ld080000b9的机器,也是这样计算的。符合大于当前时间,就是开机的。一个地址只代表一个机器,表中有好多同地址不同时间段的信息,只是因为即使关机了,消息也不会删除,所以要取最大的时间才能确定它是否开关机。
     故:是否开机可以计算出来,,(select mac_addr,max(time)) t1 from power_onoff where time>TO_DATE('2010-10-25''YY-MM-DD') group by mac_addr) a这个语句只是根据TIME字段看该机器是否还在线而已。
    00ld080000b7开机,00ld080000b8开机,00ld080000b9开机,
    00ld080000b1,00ld080000b2到00ld080000b6假设都不是开机的,我要在这种情况下得到开机的比例,不是具体到每个地址的开机比例。
      

  3.   

    select count(distinct power_onoff.mac_addr) from power_onoff,(select mac_addr,max(time)) t1 from power_onoff where time<=TO_DATE('2010-10-25''YY-MM-DD') group by mac_addr) a where power_onoff.mac_addr and power_onoff.time=a.t1 and power_onoff.type='0'
    这条语句能查出来在线的个数
    select count(distinct power_onoff.mac_addr) from power_onoff,(select mac_addr,max(time)) t1 from power_onoff where time>TO_DATE('2010-10-25''YY-MM-DD') group by mac_addr) a where power_onoff.mac_addr and power_onoff.time=a.t1 and power_onoff.type='0'or power_onoff.type='1'这条语句能查出来不在线的个数
    如何拼凑在一起呢,如何一个sql语句就显示出来在线和不在线的个数呢
      

  4.   


    --1.
    select count(case when time<=TO_DATE('2010-10-25','YY-MM-DD') and a.type='0' then mac_addr end) "在线",
    count(case when time<=TO_DATE('2010-10-25','YY-MM-DD') and a.type='1' then mac_addr end) "离线"
    from
    (select mac_addr,type,time,row_number() over(partition by mac_addr order by time desc) rn
    from power_onoff
    )
    where rn=1--2.
    select count(distinct case when time<=TO_DATE('2010-10-25','YY-MM-DD') and a.type='0' then mac_addr end),
    count(distinct case when time<=TO_DATE('2010-10-25','YY-MM-DD') and   a.type='1') then mac_addr end)
    from power_onoff a 
    where not exists(select 1 from power_onoff b where and a.mac_addr=b.mac_addr and a.time<b.time)