oracle查询100到200数据,100分数据库查询语句(ORACLE 11g)
100分求一個數據庫查詢語句(ORACLE 11g)
一張表tabl1?如下:
epqname?????????????createtime?????????????????????????????endtime
設備1?????????????2014.10.01?11:00:00????????????2014.10.01?13:22:00
設備2?????????????2014.10.27?11:00:00????????????2014.10.27?14:10:00
設備3?????????????2014.11.11?14:00:00????????????2014.11.11?15:00:00
設備4?????????????2014.11.29?11:00:00????????????2014.11.29?16:00:00
我想查詢出來結果,顯示出,每個設備每天運轉的小時數,不足1小時的,算1小時(1小時25分,1小時10分鐘??都算2小時)
將日期作為列名,顯示當天運轉的時間。
epqname??????2014.10.01???????2014.10.27???????2014.11.11???????2014.11.29
設備1?????????????????????3??????????????????????????0????????????????????????0????????????????????????????0
設備2?????????????????????0??????????????????????????4????????????????????????0????????????????????????????0
設備3?????????????????????0??????????????????????????0????????????????????????1????????????????????????????0
設備4?????????????????????0??????????????????????????0????????????????????????0????????????????????????????5
------解決思路----------------------
本帖最后由 bw555 于 2014-11-27 11:12:47 編輯
先給你寫一個不跨天的情況
with?T?AS?(
SELECT?epqname,TRUNC(createtime)?D,CEIL((ENDTIME-createtime)?*24)?AS?S
FROM?tabl1)
SELECT?epqname,
SUM(DECODE(D,TO_DATE('2014.10.01','YYYY.MM.DD'),S))?AS?"2014.10.01",
SUM(DECODE(D,TO_DATE('2014.10.27','YYYY.MM.DD'),S))?AS?"2014.10.27",
SUM(DECODE(D,TO_DATE('2014.11.11','YYYY.MM.DD'),S))?AS?"2014.11.11",
SUM(DECODE(D,TO_DATE('2014.11.29','YYYY.MM.DD'),S))?AS?"2014.11.29"
FROM?T
GROUP?BY?epqname
------解決思路----------------------
如果你的createtime和endtime是date類型的話(如果不是要用to_date轉化一下數據類型),借鑒下面代碼。
select?epqname,
sum(case?when?to_char(t.createtime,'yyyy.mm.dd')='2014.10.01'
then?ceil((t.endtime-t.createtime)*24)?else?0?end)?"2014.10.01",
sum(case?when?to_char(t.createtime,'yyyy.mm.dd')='2014.10.27'
then?ceil((t.endtime-t.createtime)*24)?else?0?end)?"2014.10.27",
sum(case?when?to_char(t.createtime,'yyyy.mm.dd')='2014.11.11'
then?ceil((t.endtime-t.createtime)*24)?else?0?end)?"2014.11.11",
sum(case?when?to_char(t.createtime,'yyyy.mm.dd')='2014.11.29'
then?ceil((t.endtime-t.createtime)*24)?else?0?end)?"2014.11.29"
from?tabl1?t
group?by?epqname
order?by?epqname;
------解決思路----------------------
一、不確定列直接查詢是沒辦法實現的提供兩個方案
1、動態拼接sql語句,然后生成視圖,然后select?*?from?視圖
2、動態拼接sql語句,利用游標,將結果循環打印輸出
二、存在跨天的情況,需要進行拆分
用下面的語句的查詢結果代替原表,未測試,你先執行下看看效果吧
select?epqname,
greatest(trunc(createtime)+level-1,createtime)?createtime,
least(trunc(createtime)+level,endtime)?endtime
from?tabl1
connect?by?trunc(createtime)+level-1<=trunc(endtime)
and?rowid=prior?rowid
and?prior?dbms_random.value?is?not?null
------解決思路----------------------
動態行轉不定列的方法,在9#已經說明,采用視圖實現的方式可以參考下面鏈接,大同小異
參考3#固定列數的sql寫法,拼接sql語句,然后動態創建視圖,然后select?*?from?視圖
oracle行轉列(動態行轉不定列)
目前的oracle版本里沒有任何可以直接的行轉動態列方法,只能借助視圖、游標之類的工具間接實現
如果從xml中select?可以借助pivot?any的寫法實現
總結
以上是生活随笔為你收集整理的oracle查询100到200数据,100分数据库查询语句(ORACLE 11g)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle的age datetime,
- 下一篇: 大屏可视化项目之智慧楼宇 智慧园区项目