2016-05-31 18 views
0

Ich habe unter Abfrage, in der ich das kombinieren Spalt Ergebnis FC,FM,MS und Art basierend auf Farbe, so dass 'R' verketten will, soll zuerst dann 'Y' und dann 'G' kommen. Ich habe versucht, unter Abfrage, aber die Sortierung funktioniert nicht in der richtigen Reihenfolge.verketten, um durch dekodieren in Oracle mit

select bps.NAME as BNM, 
max(case when bbp.BID = 0.11 then os.SO end) FC, 
max(case when bbp.BID = 0.12 then os.SO end) FM, 
max(case when bbp.BID = 0.13 then os.SO end) MS 
from PR_BP bbp 
JOIN PR_BP_BPP bp ON bp.BP_ID = bbp.BP_ID 
JOIN BRD b ON bbp.BID = b.BID 
JOIN OS_VIEW os ON bbp.BP_ID = os.OD 
where os.TO = 'PR_BP_BPP' AND bbp.B_A = 'Y' 
group by bp.NAME 
ORDER BY FC,FM,MS 
+2

Helfen Sie uns, Ihnen zu helfen - Teilen Sie Ihre Tabellenstrukturen, einige Beispieldaten und das Ergebnis, das Sie für dieses Beispiel erzielen möchten – Mureinik

Antwort

1

Nur CASE EXPRESSION verwenden, ziehe ich es, da es einfacher ist zu lesen:

ORDER BY CASE WHEN FC = 'R' THEN 1 
       WHEN FC = 'Y' THEN 2 
       WHEN FC = 'G' THEN 3 
     END, 
     CASE WHEN FM = 'R' THEN 1 
       WHEN FM = 'Y' THEN 2 
       WHEN FM = 'G' THEN 3 
     END, 
     CASE WHEN MS = 'R' THEN 1 
       WHEN MS = 'Y' THEN 2 
       WHEN MS = 'G' THEN 3 
     END 

Das heißt, wenn ich verstanden, was Sie tun wollen, ich bin nicht ich die Logik gefolgt Sie soll tun, denke ich, was es tut überprüft wird, wenn FC||FM||MS-R/Y/G gleich ist, das glaube ich nicht

EDIT ist: wenn Sie zum ersten Mal bestellen möchten durch, wenn einer von ihnen ist ‚R‘, dann, wenn eine der Spalten ist 'Y' ...

ORDER BY CASE WHEN 'R' IN(FC,FM,MS) THEN 1 
       ELSE 2 
     END, 
     CASE WHEN 'Y' IN(FC,FM,MS) THEN 1 
       ELSE 2 
     END, 
     CASE WHEN 'G' IN(FC,FM,MS) THEN 1 
       ELSE 2 
     END 
+0

@Andrew Versuchen Sie es jetzt – sagi

1

Separate Zeichenfolge verkettete Werte aus in separate Decodes:

ORDER BY DECODE(FC, 'R', 1, 'Y', 2, 'G', 3), 
     DECODE(FM, 'R', 1, 'Y', 2, 'G', 3), 
     DECODE(MS, 'R', 1, 'Y', 2, 'G', 3) 

Wenn Sie möchten, Werte ignorieren, wenn sie NULL und einfach irgendwie durch die erste nicht-NULL sind dann:

ORDER BY DECODE(COALESCE(FC, FM, MS), 'R', 1, 'Y', 2, 'G', 3), 
     DECODE(COALESCE(FM, MS),  'R', 1, 'Y', 2, 'G', 3), 
     DECODE(MS,      'R', 1, 'Y', 2, 'G', 3) 

oder:

ORDER BY DECODE(COALESCE(FC, FM, MS), 'R', 1, 'Y', 2, 'G', 3), 
     DECODE(COALESCE(FM, MS, FC), 'R', 1, 'Y', 2, 'G', 3), 
     DECODE(COALESCE(MS, FC, FM), 'R', 1, 'Y', 2, 'G', 3)