WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Oracle-SQL Frage: Leider fällt mir kein passender Titel zu diesem Problem ein... (http://www.wcm.at/forum/showthread.php?t=238493)

Nestrus 04.03.2010 11:31

Oracle-SQL Frage: Leider fällt mir kein passender Titel zu diesem Problem ein...
 
Hallo,

ich hab in einer Oracle-Datenbank eine Zustands-Tabelle mit den 16 Zuständen 1, 2, 4, 8, 16, ... 65536. Jede Person hat mindestens einen Eintrag, meist 4 und 4096 mit einem Zeitstempel. Jetzt interessieren mich diese Zeitstempel, aber nur einer pro Person und zwar entweder von Zustand 4, 2, 1, 128 in dieser Reihenfolge. Soll heißen: Gibt es einen Eintrag mit 4 soll der Zeitstempel von dort genommen werden, ansonsten von 2, wenn es den auch nicht gibt von 1 und wenn es den nicht gibt von 128. Sollte es tatsächlich eine Person geben, die keinen dieser vier Zustände hat, interessiert sie mich nicht.

Wie kann ich das elegant lösen?


Vielen Dank im Voraus für eure Hilfe und schöne Grüße,
Nestrus

pc.net 04.03.2010 11:35

entweder du arbeitest zur gewünschten sortierung mit decode oder du nimmst pl/sql ;)

Nestrus 04.03.2010 14:20

PL/SQL kann ich leider nicht wirklich. Ich verstehe auch nicht ganz, wie das mit decode funktionieren soll.

Die Tabelle schaut z.B. so aus:

ID | Zustand | Bearbeiter | Zeitstempel |
---------------------------------------------
1........4...........16.............1.10.2009
1........16...........2.............12.10.2009
1........128........11............. 1.1.2010
2........1...........10.............10.2.2009
2........32...........4.............3.6.2009
3........ 2...........16.............1.1.2010

Als Ergebnis soll rauskommen:

ID | Zustand | Bearbeiter | Zeitstempel |
---------------------------------------------
1........4...........16.............1.10.2009
2........1...........10.............10.2.2009
3........ 2...........16.............1.1.2010

Ich weiß zwar, wie ich mit decode statt IDs Namen ausgeben kann, aber nicht wie ich das im where verwenden kann, damit die richtigen Zeilen kommen.

pc.net 04.03.2010 15:16

paßt da was mit den ID's nicht oder ist das absicht?

Nestrus 04.03.2010 16:20

Oh, das hätte ich anders benennen sollen, das sind nicht die IDs dieser Tablle sondern die PersonenIDs, hier also Foreign Key.

Nestrus 05.03.2010 13:36

Ich hab probiert decode anstatt wie bisher von mir gewohnt im select in die where-Klausel zu schreiben, aber es kommt nur "invalid identifier":

select personid, bearbeiter, zeitstempel
from test
where zustand = decode (zustand,4,4,2,2,1,1,128,128);

Außerdem hab eich mir case...when angeschaut. Ich dachte, damit könnte ich erreichen, dass bei Zustand 4 diese Zeilen verknüpft werden, ansonsten wenn 2 vorkommt die usw. aber das bringt den gleichen Fehler:

select personid, bearbeiter,
(case zustand
when 4 then zeitstempel
when 2 then zeitstempel
when 1 then zeitstempel
when 128 then zeitstempel
else '?'
end)
from test;


Weiß jemand wie es richtig ist?

pong 06.03.2010 20:18

select distinct(1), 2,
case zustand
when 4 then "1"
when 2 then "2"
when 1 then "3"
when 128 then "4"
else "?"
end
from irgendwo
where zustand in (2,4, .. ,128)
order by 3;

untested, sollte aber - bis auf Syntaxfehler - so passen, wenn auch verdammt grauslich.

pc.net 08.03.2010 12:04

es geht ja um oracle-sql :rolleyes:

ich hab zum testen die tabelle mit folgenden spalten angelegt:
ID
PERS_ID
ZUSTAND
BEARBEITER
ZEITSTEMPEL

und die query funktioniert dann so:

Code:

select *
from TABELLE t1
where decode(t1.zustand,
            4, 4,
            2, 3,
            1, 2,
            128, 1,
            0) = (select max(decode(t2.zustand,
                                    4, 4,
                                    2, 3,
                                    1, 2,
                                    128, 1,
                                    0))
                  from TABELLE T2
                  where t2.pers_id = t1.pers_id
                    and t2.zustand in (4,2,1,128)
                  )
                ;

sorry, hat zwar etwas länger gedauert, aber dafür haben mein kollege und ich das problem gelöst und die lösung auch getestet ;)

Nestrus 10.03.2010 18:56

@pong: Leider verstehe ich den Code nicht wirklich und auch nicht das Ergebnis das rauskommt...

@pc.net: Das verstehe ich auch nicht ganz, aber das Ergebnis schaut genau nach dem aus, was ich wollte!

Vielen Dank für die Hilfe!

pc.net 11.03.2010 12:29

ich hab beim copy/paste in der eile leider vergessen die tabellen-namen und die tabellen-aliase anzupassen ... ist oben aber jetzt korrigiert ...

und zur erklärung:
mit der decode-funktion wird dem zustands-wert ein anderer wert zugewiesen (bzw. für alle werte, die nicht in der liste aufscheinen, auf 0 gesetzt), um mit der max-funktion die gewünschte reihung simmulieren zu können ... die werte in dieser reihung kann man dann natürlich auch beliebig erweitern bzw. anpassen ...


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag