7 Stimmen

Leere Zeile in das Ergebnis nach ORDER BY einfügen

Ich habe eine SQL-Abfrage und möchte eine leere Zeile in das Ergebnis einfügen, damit das Ergebnis leicht zu sehen ist. Ich möchte es nach ORDER BY einfügen. Ich weiß nicht, ob es getan werden könnte.

Hier ist meine ausgewählte Erklärung.

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

6voto

Alex Poole Punkte 172685

Sie können, so wie Michael und Gordon es getan haben, einfach eine leere Zeile anhängen mit union all aber Sie müssen es vor dem 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;

... und Sie können nicht die case die Gordon direkt in der order by weil es sich nicht um einen ausgewählten Wert handelt - Sie erhalten eine ORA-07185. (Beachten Sie, dass die Spaltennamen in der Datei order by sind die Aliasnamen die Sie im Abschnitt select , nicht die in der Tabelle; und Sie fügen den Tabellennamen/Alias nicht ein; und es ist nicht notwendig, den Alias null Spalten im Union-Teil, aber der Übersichtlichkeit halber sollten Sie das tun).

Dies setzt jedoch voraus, dass null nach den realen Werten sortiert werden, was nicht immer der Fall ist (nicht sicher, könnte aber durch NLS-Parameter beeinflusst werden), und es ist nicht bekannt, ob die realen eventkey jemals sein kann null sowieso. Daher ist es wahrscheinlich sicherer, in beiden Teilen der Abfrage eine Dummy-Spalte einzuführen und diese für die Bestellung zu verwenden, sie aber durch Verschachtelung der Abfrage aus den Ergebnissen auszuschließen:

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;

Die Handhabung des Datums ist allerdings merkwürdig, insbesondere die to_date(to_char(...)) Teile. Es sieht so aus, als ob Sie nur versuchen, den Zeitanteil zu verlieren, in diesem Fall können Sie verwenden trunk stattdessen:

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

Die Anwendung einer Funktion auf die Datumsspalte verhindert jedoch die Verwendung eines Indexes, so dass es besser ist, diesen in Ruhe zu lassen und den variablen Teil in den richtigen Zustand für den Vergleich zu bringen:

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

En + 1 fügt einen Tag hinzu, so id DATE2 war 07/12/2012 ist der Filter < 2012-07-13 00:00:00 , was dasselbe ist wie <= 2012-07-12 23:59:59 .

3voto

Gordon Linoff Punkte 1198148

Ihre Frage ist ziemlich kompliziert. SQL garantiert nur die Reihenfolge der Ergebnisse, und zwar durch das Ordnen nach. Es garantiert nicht, was danach passiert. Sie müssen also die leere Zeile einfügen und dann die Informationen nachtragen:

<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

In der Praxis würde die Lösung von @Michael normalerweise funktionieren. Aber sie ist nicht garantiert.

Außerdem sollten Sie entscheiden, ob Sie Leerzeichen oder NULLen haben wollen. Ich vermute, dass die erste ID eine Zahl ist, also setze ich sie auf NULL.

Im Allgemeinen werden solche Feinheiten der Darstellung von der aufrufenden Anwendung erledigt. Vielleicht brauchen Sie ein besseres SQL-Abfragetool, um die Daten übersichtlicher darzustellen.

Die vollständige Abfrage sieht folgendermaßen aus (alle Felder sind auf NULL gesetzt, Sie können sie aber auch leer lassen, wenn Sie dies wünschen):

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

2voto

Michael Berkowski Punkte 260923

Das ist sicher eine seltsame Forderung, aber ja, das kann man machen, indem man eine UNION gegen eine Zeile mit leeren Werten. Um sicherzustellen, dass das Order-by auf die eigentliche Abfrage angewendet wird, schließen Sie das Ganze in () und dann mit der leeren Zeile verbunden.

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

Je nachdem, wie Sie das Ergebnis präsentieren, würde ich andere Methoden zur Aufteilung des Ergebnisses in Betracht ziehen. Das Anhängen leerer Zeilen an eine Abfrage zu Präsentationszwecken steht im Widerspruch zur Trennung von Geschäfts- und Präsentationslogik.

1voto

Alberto De Caro Punkte 5041

Das Ergebnis wird auf einer HTML-Seite angezeigt.

Verwenden Sie also SQL, um die Daten zu extrahieren, nicht um die Ausgabe zu formatieren. Je nach Seitenstruktur und -layout gibt es eine Vielzahl von Lösungen. Schauen Sie mal aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X