7

SQLクエリがあります。結果を簡単に確認できるように、結果に空白行を挿入します。ORDERBYの後に挿入したい。それができるかどうかわからない。

これが私の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
4

4 に答える 4

6

MichaelとGordonが行ったように、空の行をでタックすることができますが、 :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;

...選択された値ではないためcase、Gordonが直接持っていたものを使用することはできませんorder by-ORA-07185を取得します。(の列名は、テーブルの列ではなく、で割り当てorder byエイリアスであることに注意してselectください。テーブル名/エイリアスは含めないでください。またnull、ユニオン部分の列にエイリアスを付ける必要はありません。ただし、わかりやすくするために必要な場合があります)。

ただし、これは実際の値の後にソートされることに依存しnullます。これは常に当てはまるとは限りません(確かではありませんが、NLSパラメーターの影響を受ける可能性がありますeventkeynull。したがって、クエリの両方の部分にダミー列を導入し、それを順序付けに使用する方がおそらく安全ですが、クエリをネストして結果から除外します。

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日を追加するので、idDATE2は、、07/12/2012フィルターは< 2012-07-13 00:00:00、と同じ<= 2012-07-12 23:59:59です。

于 2012-07-12T08:14:58.430 に答える
3

あなたの質問はかなり複雑です。SQLは、byによる順序付けによる結果の順序付けのみを保証します。その後に何が起こるかを保証するものではありません。したがって、空白行を入力してから、単語の後に情報を追加する必要があります。

<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

実際には、@Michaelのソリューションは通常は機能します。しかし、それは保証されていません。

また、ブランクまたは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 
于 2012-07-11T16:14:50.867 に答える
2

確かに奇妙な要求ですが、そうUNIONです、文字通りの空白の値の行に対して反対を行うことによってそれを行うことができます。順序付けが実際のクエリに確実に適用されるようにするには、すべてをで囲み、()空白行に対して結合します。

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

最後に、この結果をどのように提示するかに応じて、結果の間隔を空ける他の方法を検討します。プレゼンテーション目的でクエリに空白行を追加すると、ビジネスロジックとプレゼンテーションロジックが分離されます。

于 2012-07-11T16:09:52.317 に答える
1

結果はHTMLページに表示されます。

したがって、出力をフォーマットするのではなく、SQLを使用してデータを抽出します。ページ構造とレイアウトに応じて、多くの解決策があります。こちらをご覧ください。

于 2012-07-11T19:17:26.090 に答える