2012-07-11 74 views
4

我有SQL查詢,我想在結果中添加插入空行,因此很容易看到結果。 我想在ORDER BY之後插入它。不知道是否可以做到。插入空行後ORDER BY

這是我的select語句。

SELECT TableName.CREWACTIONFACTID 
     ,TableName.CREWKEY as CrewKey 
     ,TableName.EVENTKEY as EventID 
     ,TableName.ACTIONSEQUENCE 
     ,case TableName.ACTIONTYPE 
      when 'DISPATCHED' then '2-Dispatched' 
      when 'ASSIGNED' then '1-Assigned' 
      when 'ENROUTE' then '3-Entoute' 
      when 'ARRIVED' then '4-Arrived' 
      else 'unknown' 
      end as Type 
     ,TableName.STARTDATETIME as StartTime 
     ,TableName.ENDDATETIME as EndTIme 
     ,TableName.DURATION as Duration 

    FROM DatabaseName.TableName TableName 
    where 
    To_Date(to_char(TableName.STARTDATETIME, 'DD-MON-YYYY')) >= To_Date('?DATE1::?','MM/DD/YYYY') 
    AND To_Date(to_char(TableName.ENDDATETIME, 'DD-MON-YYYY')) <= To_Date('?DATE2::?','MM/DD/YYYY') 
    ORDER BY TableName.EVENTKEY, TableName.STARTDATETIME,TableName.ACTIONSEQUENCE 
+0

結果將顯示在哪裏? HTML頁面? WinForm的? – 2012-07-11 16:12:36

+0

@ADC確實將顯示在HTML頁面 – Mowgli 2012-07-11 18:32:06

回答

5

可以,幾乎邁克爾和戈登一樣,只是釘一個空行與union all,但你需要的order by之前有它:

... 
and to_date(to_char(t.enddatetime, 'DD-MON-YYYY')) <= 
    to_date('?DATE2::?','MM/DD/YYYY') 
union all 
select null, null, null, null, null, null, null, null 
from dual 
order by eventid, starttime, actionsequence; 

...你不能使用Gordon在order by中直接輸入的case因爲它不是一個選定的值 - 你會得到一個ORA-07185。 (請注意,order by中的列名稱是您在select中分配的別名,而不是表中的列名;您不包含表名/別名;並且不需要爲null列在聯盟部分,但你可能想要澄清)。

但是這依賴於null之後的任何真正的價值,這可能不總是這樣的情況進行排序(不知道,但可能被NLS參數的影響),而如果真正eventkey可以永遠null它不知道無論如何。因此,它可能更安全,在查詢的兩個部分引入虛擬列,並利用它來進行排序,而是通過嵌套查詢從結果中排除:

select crewactionfactid, crewkey, eventid, actionsequence, type, 
    starttime, endtime, duration 
from (
    select 0 as dummy_order_field, 
     t.crewactionfactid, 
     t.crewkey, 
     t.eventkey as eventid, 
     t.actionsequence, 
     case t.actiontype 
      when 'DISPATCHED' then '2-Dispatched' 
      when 'ASSIGNED' then '1-Assigned' 
      when 'ENROUTE' then '3-Enroute' 
      when 'ARRIVED' then '4-Arrived' 
      else 'unknown' 
     end as type, 
     t.startdatetime as starttime, 
     t.enddatetime as endtime, 
     t.duration 
    from schema_name.table_name t 
    where to_date(to_char(t.startdatetime, 'DD-MON-YYYY')) >= 
     to_date('?DATE1::?','MM/DD/YYYY') 
    and to_date(to_char(t.enddatetime, 'DD-MON-YYYY')) <= 
     to_date('?DATE2::?','MM/DD/YYYY') 
    union all 
    select 1, null, null, null, null, null, null, null, null 
    from dual 
) 
order by dummy_order_field, eventid, starttime, action sequence; 

的日期處理爲奇數,雖然,特別是to_date(to_char(...))部分。它看起來像你只是想失去的時間部分,在這種情況下,你可以使用trunk代替:

where trunc(t.startdatetime) >= to_date('?DATE1::?','MM/DD/YYYY') 
and trunc(t.enddatetime) <= to_date('?DATE2::?','MM/DD/YYYY') 

但應用任何函數的日期欄阻止它正在使用的任何指標,所以最好是離開單獨並獲得正確的狀態變量部分進行比較:

where t.startdatetime >= to_date('?DATE1::?','MM/DD/YYYY') 
and t.enddatetime < to_date('?DATE2::?','MM/DD/YYYY') + 1 

+ 1每天增加了,所以ID DATE207/12/2012,過濾器是< 2012-07-13 00:00:00,這是一樣的<= 2012-07-12 23:59:59

+0

Gordon也提到Dual不與所有的SQL,我遵循你的解決方案,我仍然得到'FROM'錯誤'在處理命令期間發生了一個或多個錯誤。 ORA-00923:從關鍵字找不到預期在' – Mowgli 2012-07-12 13:11:51

+0

亞歷克斯,感謝您考慮'where'條件,我會按照並解決此後。 – Mowgli 2012-07-12 13:16:09

+0

那麼,確切的代碼在SQL * Plus中爲我運行,除了我使用自己的模式和表名稱,並用'07/11/2012'代替'?DATE1 ::?'。因爲這似乎對你原來可能不是問題。唯一可疑的是使用'type'作爲別名,因爲它是一個保留字,但是您之前再次使用過。你可以直接對你的數據庫運行它嗎? – 2012-07-12 13:22:01

2

一個奇怪的要求是肯定的,但它是通過使一對UNION字面空白值的行來完成。爲了確保將order-by應用於真實查詢,請將整個事件放在()中,然後將其與空行對齊。

SELECT * FROM 
(SELECT TableName.CREWACTIONFACTID 
    ,TableName.CREWKEY as CrewKey 
    ,TableName.EVENTKEY as EventID 
    ,TableName.ACTIONSEQUENCE 
    ,case TableName.ACTIONTYPE 
     when 'DISPATCHED' then '2-Dispatched' 
     when 'ASSIGNED' then '1-Assigned' 
     when 'ENROUTE' then '3-Entoute' 
     when 'ARRIVED' then '4-Arrived' 
     else 'unknown' 
     end as Type 
    ,TableName.STARTDATETIME as StartTime 
    ,TableName.ENDDATETIME as EndTIme 
    ,TableName.DURATION as Duration 
FROM DatabaseName.TableName TableName 
where 
To_Date(to_char(TableName.STARTDATETIME, 'DD-MON-YYYY')) >= To_Date('?DATE1::?','MM/DD/YYYY') 
AND To_Date(to_char(TableName.ENDDATETIME, 'DD-MON-YYYY')) <= To_Date('?DATE2::?','MM/DD/YYYY') 
ORDER BY TableName.EVENTKEY, TableName.STARTDATETIME,TableName.ACTIONSEQUENCE 
) 
UNION ALL 
SELECT 
    '' AS CREWACTIONFACTID, 
    '' AS CrewKey, 
    '' AS EventID, 
    '' AS ACTIONSEQUENCE, 
    '' AS Type, 
    '' AS StartTime, 
    '' AS EndTime, 
    '' AS Duration 
FROM dual 

最後,這取決於你如何呈現這個結果,我會考慮間隔出來的結果的其他方法。面對業務和表示邏輯的分離,將空白行附加到用於演示目的的查詢會飛。

+0

添加'UNION ALL'不保證任何特定順序。對於實現來說,在結果的任何位置插入額外的行是完全合法的。 – 2012-07-11 16:13:13

+0

感謝您的幫助,我厭倦了,但是我在運行時遇到了錯誤。 'System.Data.OleDb.OleDbException:ORA-00907:缺少右括號' – Mowgli 2012-07-11 17:17:07

+0

@Mogli也許是因爲在'FROM'子句之前還有一個額外的換行符。否則,沒有不平衡的parens。 – 2012-07-11 17:40:07

2

你的問題相當複雜。 SQL僅通過按順序保證結果的排序。它並不能保證事後會發生什麼。所以,你必須把一個空行,然後添加信息後記:

<your select query minus the order by> 
union all 
select NULL as CrewActionFatId, . . . 
order by (case when CrewActionFactId is NULL then 1 else 0 end), 
     TableName.EVENTKEY, TableName.STARTDATETIME,TableName.ACTIONSEQUENCE 

在實踐中,@邁克爾的解決方案將正常工作。但不能保證。

此外,您應該決定是否要空白或NULL。我猜第一個id是一個數字,所以我將它設置爲NULL。

一般而言,這種表示細節由調用應用程序處理。也許你需要一個更好的SQL查詢工具來更清晰地查看數據。

下面是完整的查詢將是什麼樣子(設置爲NULL的所有字段,你可以,如果你喜歡更改爲空白):

SELECT TableName.CREWACTIONFACTID, TableName.CREWKEY as CrewKey, 
     TableName.EVENTKEY as EventID, TableName.ACTIONSEQUENCE, 
     (case TableName.ACTIONTYPE 
      when 'DISPATCHED' then '2-Dispatched' 
      when 'ASSIGNED' then '1-Assigned' 
      when 'ENROUTE' then '3-Entoute' 
      when 'ARRIVED' then '4-Arrived' 
      else 'unknown' 
     end) as Type, 
     TableName.STARTDATETIME as StartTime, 
     TableName.ENDDATETIME as EndTIme, 
     TableName.DURATION as Duration 
FROM DatabaseName.TableName TableName 
where To_Date(to_char(TableName.STARTDATETIME, 'DD-MON-YYYY')) >= To_Date('?DATE1::?','MM/DD/YYYY') AND 
     To_Date(to_char(TableName.ENDDATETIME, 'DD-MON-YYYY')) <= To_Date('?DATE2::?','MM/DD/YYYY') 
union all 
SELECT NULL AS CREWACTIONFACTID, NULL AS CrewKey, NULL AS EventID, 
     NULL AS ACTIONSEQUENCE, NULL AS Type, NULL AS StartTime, NULL AS EndTime, 
     NULL AS Duration 
from dual 
ORDER BY (case when CrewActionFactId is NULL then 1 else 0 end), 
     TableName.EVENTKEY, TableName.STARTDATETIME, TableName.ACTIONSEQUENCE 
+0

感謝您的回覆,我對SQL很陌生,所以我很難理解您發佈的代碼,
所以說你頂一下就說我需要把我的選擇查詢而不是「union all」,我不知道這是否是'。 。 .'請解釋。再次感謝 – Mowgli 2012-07-11 17:25:40

+0

關於''不要忘了。 。 。'我現在明白了,所以我用'null'替換了'''',但是我需要'< >'還是'()'謝謝 – Mowgli 2012-07-11 17:29:42

+0

感謝您的編輯和更新,我試過了,但是我得到了' -00923:未在[ – Mowgli 2012-07-11 18:33:23

1

結果將在HTML頁面中desplayed。

因此,使用SQL來提取數據,而不是格式化輸出。 根據頁面結構和佈局,有很多解決方案。 看一看here

+0

我不認爲這很重要,我可以在SQLPLUS中運行相同的查詢,但輸出應該是相同的,該鏈接有佈局,我不能編輯任何部分HTML代碼全部由軟件自己生成。 – Mowgli 2012-07-11 19:24:02