2016-08-19 3 views
-1

ich eine tabelle1 mit Daten wiekundenspezifischen Auftrag in SQL Oracle

group_name model_no model_year cost 
mech  9000  2015   200 
mech  9012  2015   300 
mech  allmodelno 2015   500 
cs   9000  2016   600 
cs   9012  2016   400 
cs   allmodelno 2016   1000 

möchte ich die Ausgabe

group_name model_no model_year cost 
    mech  9000  2015   200 
    mech  9012  2015   300 
    cs   9000  2016   600 
    cs   9012  2016   400 
    mech  allmodelno 2015   500 
    cs   allmodelno 2016   1000 

i 'select * from table1, um durch model_no, model_yr' versucht zu sein

sind immer Ergebnis als

 group_name model_no model_year cost 
     mech  9000  2015   200 
     cs   9000  2016   600 
     mech  9012  2015   300 
     cs   9012  2016   400 
     mech  allmodelno 2015   500 
     cs   allmodelno 2016   1000 

die als group_name falsch ist nicht als

erwartet kommen, wenn ich verwende ‚SELECT * from table1, um durch group_name, model_no, model_year‘ dann ist immer Ergebnis als

group_name model_no model_year cost 
    cs   9000  2016   600 
    cs   9012  2016   400 
    cs   allmodelno 2016   1000 
    mech  9000  2015   200 
    mech  9012   2015  300 
    mech  allmodelno 2015   500 

wieder die Serie nicht wie erwartete ich die letzte Ausgabe in der folgenden Reihenfolge sein will

group_name model_no model_year cost 
    cs   9000  2016   600 
    cs   9012  2016   400 
    mech  9000  2015   200 
    mech  9012  2015   300 
    cs   allmodelno 2016   1000 
    mech  allmodelno 2015   500 

kann es achived wird durch oder von einem anderen way.please mit helfen, um mir .thanks

HINWEIS: "Meine Logik im Detail erklärt" Die allmodelno Zeilen sind die Zwischensumme für die jeweilige group_name und model_year.i wollen alle 'alle Modell keine' Datensatz in der Unterseite der Tabelle sein.

Zuerst mag ich die normalen Aufzeichnungen (mit outem Wert Ihres) oben in der Reihenfolge des group_name, model_no aufgeführt werden, model_year

dann werde ich unten Ausgabe erhalten, die ist Tabelle ‚normal‘

group_name model_no model_year cost 
cs   9000  2016   600 
cs   9012  2016   400 
mech  9000  2015   200 
mech  9012  2015   300 

dann möchte ich die Zwischensumme in derselben Reihenfolge group_name, model_year wie unten gezeigt .model_no hier nicht genommen wird, weil es so sein wird ‚allmodelno‘ für alle die Teilsumme, die Tabelle ‚Wert Ihrer‘ ist

cs   allmodelno 2016   1000 
    mech  allmodelno 2015   500 

Vereinigung i die beiden, aber die Reihenfolge, in

group_name model_no model_year cost 
     cs   9000  2016   600 
     cs   9012  2016   400 
     mech  9000  2015   200 
     mech  9012  2015   300 
     cs   allmodelno 2016   1000 
     mech  allmodelno 2015   500 

sein sollte, aber ich alles durcheinander wie

group_name model_no model_year cost 
     cs   9000  2016   600 
     cs   9012  2016   400 
     cs   allmodelno 2016   1000 
     mech  9000  2015   200 
     mech  9012   2015  300 
     mech  allmodelno 2015   500 
+2

ich weiß es nicht, aber Ihre erwartete Ausgabe scheint keine Reihenfolge zu haben. Es ist nicht nach einer bestimmten Spalte angeordnet. – SomeJavaGuy

+1

Bitte erläutern Sie die Logik, die Sie für die Bestellung verwenden müssen – Aleksej

+1

Diese Beispieldaten sind nicht genug, um herauszufinden, welche Reihenfolge Sie im Sinn haben. Könnten Sie bitte die Frage bearbeiten und erklären, welche Regeln Sie anwenden möchten? –

Antwort

0

Versuchen Sie, diese bekommen:

SELECT * 
FROM Table1 T 
ORDER BY 
    CASE 
     WHEN model_name || model_no like '%allmodelno' THEN 1 
     ELSE 0 
    END, 
    model_year 
+0

Da es sich bei einem Sideknoten um ein 'char' handelt, wird' 'lexography" 'eine lexographische Reihenfolge für die Zahlen und keine numerische Reihenfolge erstellen. – SomeJavaGuy

+0

Ja, mit Daten gepostet, ich hoffe, unser OP hat eine Patern für Wert und wenn er alle Modell verwenden möchte immer allmodelno –

0

Verwenden case Ausdruck in der ORDER BY, um allmodelno Zeilen nach dem ot zu sortieren ihre Reihen:

select * from table1 
order by case when model_no <> 'allmodelno' then 1 else 2 end, 
     model_year, group_name, model_no; 

Führt als:

SQL>select * from table1 
SQL&order by case when model_no <> 'allmodelno' then 1 else 2 end, 
SQL&   model_year, group_name, model_no; 
group_name model_no model_year  cost 
========== ========== =========== =========== 
mech  9000    2015   200 
mech  9012    2015   300 
cs   9000    2016   600 
cs   9012    2016   400 
mech  allmodelno  2015   500 
cs   allmodelno  2016  1000 

        6 rows found 

Hinweis: Sind diese allmodelno in der Tabelle gespeicherten Zeilen? Scheint ein bisschen riskant. Wenn eine Zeile eingefügt/aktualisiert/gelöscht wird, ist die Zeile allmodelno inkonsistent. Es ist besser, die Laufzeit von allmodelno zu berechnen (z. B. mithilfe einer Ansicht).)