![]() |
Datenbank: Oracle • Zugriff über: Hibernate
Hilfe bei Erstellung eines SQL-Statements
Hallo Leude,
ich habe mal wieder eine Frage zur Erstellung einer DB-Abrage. Ich bin alles andere als fit beim Formulieren von SQL-Statements. Daher formuliere ich mein Anliegen einmal hier. Folgende Struktur: [code] Tabelle: RQS rqsSk EMP_SK STATUS EFF_CRE_TS Tabelle: RQSDate rqsSk rqsDateSk NOM_DATE EMP_SK STATUS_NOM Tablle: RQSDet rqsDetSk rqsDateSk ACTN SEG_CODE_SK [code] Die Tabellen stehen wie folgt in Beziehung: [code] rqs <= 1:n => rqsDate <= 1:1 => rqsDet [code] Ich habe bisher folgendes:
SQL-Code:
Das Ergebnis liefert mehrere Zeilen, wo rqs.EFF_CRE_TS jeweils identich sind:
select
rqs.RQS_SK, rqs.RQS.EMP_SK, rqs.STATUS, rqs.EFF_CRE_TS, rqsDate.NOM_DATE, rqsDet.ACTN, rqsDet.SEG_CODE_SK, count(EFF_CRE_TS) from Rqs rqs inner join fetch rqs.rqsDates rqsdates inner join fetch rqsdates.rqsDets rqsdets where (rqs.empSk = '-979999242803' and rqsdets.actn = 'ADD' and rqsdets.segCodeSk ='-979998246801') order by rqs.effCreTs desc
Code:
Ich möchte nun statt mehrfachen Zeilen EFF_CRE_TS die Zeilen zählen und als Tage ausgeben. Als Beispiel:
RQS_SK EMP_SK STATUS EFF_CRE_TS NOM_DATE ACTN SEG_CODE_SK Tage
-979913683924 -979999242803 FAIL 01.08.2006 14:41:14 38959 ADD -979998246801 1 -979913684171 -979999242803 FAIL 01.08.2006 14:36:40 38959 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38959 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38960 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38961 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38962 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38963 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38964 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38965 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38966 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38967 ADD -979998246801 1 -979913714646 -979999242803 FAIL 31.07.2006 11:47:51 38958 ADD -979998246801 1 Für EFF_Cre_TS = 01.08.2006 13:29:35 sollte bei Tagen ein 9 erscheinen. Das kann doch nicht so schwer sein? Wie muss das gruppiert werden? Wie sieht das "count()" aus? Ich stecke fest! Kann mir jemand helfen? Vielen Dank! |
Re: Hilfe bei Erstellung eines SQL-Statements
Hallo,
Zitat:
Selbst, wenn du nur über EFF_CRE_TS gruppiert hättest, wären die einzelnen Zeilen erschienen, da die Timestamp-Werte unsichtbare Millisekunden-Anteile enthalten. Es gibt sicher DB-Funktionen mit denen du auf Sekunden-Werte runden kannst. In deinem gezeigten SQL-Statement fehlt die GROUP BY-Klausel und die Feldnamen sind stellenweise nicht korrekt geschrieben worden. Was willst du eigentlich erreichen? Sollen die Anzahl der Einträge zu einer bestimmten Sekunde gezählt werden oder zu einem bestimmten Tagesdatum? Grüße vom marabu |
Re: Hilfe bei Erstellung eines SQL-Statements
Hallo marabu
Zitat:
Was ich erreichen möchte, ist das ich die Ausgabe erhalte, die ich oben dargestellt habe + die letzte Spalte, wo dann die Anzahl gruppierter Tage angezeigt werden. Also statt:
Code:
möchte ich:
RQS_SK EMP_SK STATUS EFF_CRE_TS NOM_DATE ACTN SEG_CODE_SK Tage
-979913683924 -979999242803 FAIL 01.08.2006 14:41:14 38959 ADD -979998246801 1 -979913684171 -979999242803 FAIL 01.08.2006 14:36:40 38959 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38959 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38960 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38961 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38962 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38963 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38964 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38965 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38966 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38967 ADD -979998246801 1
Code:
Eine Gruppierung nach dem Datum(Java Date), an dem der Eintrag erstellt wurde, so dass ich in der Spalte "Tage" die Anzahl zu einem Vorgang eingetragener Zeilen habe(hier: in Zeile drei steht es wurden 9 Zeilen zu einem Vorgang eingefügt). Der Wert "EFF_CRE_TS" ist von mir in der Applikation erzeugt und an die DB übergeben worden. Der Eintrag muss also identisch sein. "TS" ist hier etwas verwirrend, da es kein Timestamp ist.
RQS_SK EMP_SK STATUS EFF_CRE_TS NOM_DATE ACTN SEG_CODE_SK Tage
-979913683924 -979999242803 FAIL 01.08.2006 14:41:14 38959 ADD -979998246801 1 -979913684171 -979999242803 FAIL 01.08.2006 14:36:40 38959 ADD -979998246801 1 -979913685879 -979999242803 FAIL 01.08.2006 13:29:35 38959 ADD -979998246801 9 Um nun alle Einträge eines Vorgangs bekommen muss ich nach EMP_SK (User_ID) und anschließend EFF_CRE_TS gruppieren (oder zuerst nach dem Datum?), ist das dann richtig? Ich verstehe nicht warum das nicht klappt... Ich hoffe, dass macht es klarer? Ist das möglich? Wie kann ich diese Ausgabe erreichen? |
Re: Hilfe bei Erstellung eines SQL-Statements
Hallo noch ein Mal,
ich habe es zum Teil hinbekommen:
Code:
Was jetzt noch fehlt ist der auskommentierte Teil. Mir ist klar, dass sich das so nicht einbinden lässt, da es sich um eine Gruppierung handelt. Was ich bräuchte ist die erste Zeile RQS_DATE mit dem kleinsten Wert RQS_DATE.NOM_DATE.
SELECT
RQS.RQS_SK, RQS.EMP_SK, RQS.EFF_CRE_TS, RQS.STATUS, //RQS_DATE.NOM_DATE, RQS_DET.ACTN, RQS_DET.SEG_CODE_SK, count(*) FROM (RQS INNER JOIN RQS_DATE ON RQS.RQS_SK = RQS_DATE.RQS_SK) INNER JOIN RQS_DET ON RQS_DATE.RQS_DATE_SK = RQS_DET.RQS_DATE_SK WHERE (((RQS.EMP_SK)= '-979999242803') AND ((RQS_DET.ACTN)='ADD') AND ((RQS_DET.SEG_CODE_SK)=-979998246801)) GROUP BY RQS.RQS_SK, RQS.EFF_CRE_TS, RQS.STATUS, RQS.EMP_SK, //RQS_DATE.NOM_DATE RQS_DET.ACTN, RQS_DET.SEG_CODE_SK ORDER BY RQS.EFF_CRE_TS DESC Gibt es eine Möglichkeit, dieses in die Abfrage mitaufzunehmen? |
Re: Hilfe bei Erstellung eines SQL-Statements
Reicht da nicht schon die MIN() Funktion - nur in der Projektion, nicht in der GROUP-Klausel.
marabu |
Re: Hilfe bei Erstellung eines SQL-Statements
Hi marabu,
Zitat:
|
Re: Hilfe bei Erstellung eines SQL-Statements
So war es gemeint:
SQL-Code:
marabu
SELECT
RQS.RQS_SK, RQS.EMP_SK, RQS.EFF_CRE_TS, RQS.STATUS, MIN( RQS_DATE.NOM_DATE ), // RQS_DET.ACTN, RQS_DET.SEG_CODE_SK, count(*) ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz