[Oracle] Verständnisproblem bei Subselect

RaketenPeter

Mitglied
[Oracle] Verständnisproblem bei Select

Hallo Cracks

Hab eine Frage zu einem Oracle Select. Ich möchte aus einer Tabelle alle Tage haben an denen NUR ein gewisser Status gesetzt wurde (in meinem Fall Status 6 und KEIN anderer)
!
Tabelle sieht wie folgt aus

Datum | Status
01.01.08 2
01.01.08 4
01.01.08 6
03.02.08 6
05.02.08 2
05.02.08 3

wie bewerkstellige ich es das ich NUR die TAGE welche diesen Status haben herraus bekomme?

mein Select sieht im Augenblick so aus :

SQL:
select Distinct to_char(eingang_datum, 'DD.MM.YYYY') from a_nachricht where Status != '1'
and Status != '2'
and Status != '3'
and Status != '4'
and Status != '5'
and Status != '7'
and Status != '8'
and Status != '9'
and Status != '0'



Vielen Dank im vorraus

Jens
 
Zuletzt bearbeitet von einem Moderator:
Hallo Cracks

Hab eine Frage zu einem Oracle Select. Ich möchte aus einer Tabelle alle Tage haben an denen NUR ein gewisser Status gesetzt wurde (in meinem Fall Status 6 und KEIN anderer)
!
Tabelle sieht wie folgt aus

Datum | Status
01.01.08 2
01.01.08 4
01.01.08 6
03.02.08 6
05.02.08 2
05.02.08 3

wie bewerkstellige ich es das ich NUR die TAGE welche diesen Status haben herraus bekomme?

mein Select sieht im Augenblick so aus :

SQL:
select Distinct to_char(eingang_datum, 'DD.MM.YYYY') from a_nachricht where Status != '1'
and Status != '2'
and Status != '3'
and Status != '4'
and Status != '5'
and Status != '7'
and Status != '8'
and Status != '9'
and Status != '0'



Vielen Dank im vorraus

Jens

Hallo,

Versuchs doch mit :
Code:
select Distinct to_char(eingang_datum, 'DD.MM.YYYY') from a_nachricht where Status = '6'


Gruss
 
Zuletzt bearbeitet von einem Moderator:
WHERE hilft in diesem Fall nicht, da es auf Zeilenebene beschränkt und nicht auf Gruppen ( in diesem Fall Tage ).
Die HAVING Klausel hilft:

Code:
DROP TABLE T;
CREATE TABLE T
(
	DATUM	DATE,
	STATE	NUMBER
);

INSERT INTO T VALUES ( TRUNC(SYSDATE) - 1, 1 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) - 1, 3 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) - 1, 6 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) - 1, 9 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) , 6 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) + 1, 6 );
INSERT INTO T VALUES ( TRUNC(SYSDATE) + 1, 8 );


SELECT 	DATUM
FROM	T
GROUP   BY DATUM
HAVING  MIN( STATE ) = 6
AND		MAX( STATE ) = 6;

DATUM
-------------------
13.05.2008 00:00:00
 
Danke!
Der Select von Exceptionfault funtkioniert! ABER ;)!

Ich habe nun festgestellt das ich auch Tage drin hab an denen KEIN Status vorhanden ist!
Das heisst am 26.02.08 hab ich Status 6 und erst am 29.02.08 bekomme ich einen neuen Status 2!
Es ist nun so das wenn ein Status kommt der nicht 6 ist immer Status 2 ist ! könnte ich nun per SubSelect alle Tage mit Status 2 abfragen und in eine Abfragen mit einer Tabelle a_auftrag Spaöte Datum vergleichen und mir NUR die Tage die KEIN Status 2 haben ausgeben lassen`?

mein Versuch sieht folgendermaßen aus!

SQL:
select distinct a_auftrag.to_char(einsatz_beginn_datum, 'DD.MM.YYYY')from a_auftrag ,(SELECT distinct	to_char(eingang_datum, 'DD.MM.YYYY')
FROM	a_nachricht
Where identifizierung ='Auto'
GROUP   BY to_char(eingang_datum, 'DD.MM.YYYY')
HAVING  MIN( Status ) = 6
AND		MAX( Status) = 6;)
                                  where  a_auftrag.to_char(einsatz_beginn_datum, 'DD.MM.YYYY') != to_char(eingang_datum, 'DD.MM.YYYY')
 
Zuletzt bearbeitet von einem Moderator:
3 Anmerkungen:

1.) TO_CHAR ist nicht ganz glücklich. Es ist immer besser mit dem Datentyp zu arbeiten in dem auch deine Daten vorliegen.
Wenn du von einem Datum nur den Tag und nicht die Zeit möchtest, ist ein TRUNC( <datum> ) besser. Vor allem ist das schneller als ein TO_CHAR und ein anschliessender String Vergleich.

2.) Das DISTINCT im INNER SELECT kannst du dir sparen. Nach der GROUP BY Klausel darf nur jeweils einmal ein Datum kommen.

3.) Ich verstehe dein SELECT nicht im Zusammenhang mit Status = 2. Wo wird danach gefiltert?
 
Vielen Dank für diese Infos werd in Zukunft darauf achten ! Aber Zeit spielt fast keine Rolle ist hier ziemlich egal ob eine Abfrage 3 Sekunden oder 50 benötigt! So stark Frequentiert ist das hier nicht!

Zu 1)
ohje dann bekommst Du bei meinem SELECT den HORROR ;D !!
Zu 2 ) das hab ich auch bemerkt
Zu 3 ) ;) ja das war nur ien ansatz habe es nun folgendermaßen realisiert und er spuckt mir mein gewünschtes ergebnis aus ! ;) !


An dieser Stelle vielen Dank hat mir sehr geholfen! Bewertung ist auf dem weg ^^

SQL:
select distinct to_date(to_char(eingang_datum, 'MM.DD.YYYY'), 'MM.DD.YYYY') from a_nachricht where to_date(to_char(eingang_datum, 'MM.DD.YYYY')) between '01/01/2007 00:00:00' and '12/31/2007 23:59:59'
minus
SELECT distinct	to_date(to_char(eingang_datum, 'MM.DD.YYYY'), 'MM.DD.YYYY')
FROM a_nachricht
Where identifizierung ='Auto' and  Signal ='2' ;
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück