Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Hilfe bei Erstellung eines SQL-Statements (https://www.delphipraxis.net/74394-hilfe-bei-erstellung-eines-sql-statements.html)

barnti 2. Aug 2006 14:55

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:
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
Das Ergebnis liefert mehrere Zeilen, wo rqs.EFF_CRE_TS jeweils identich sind:
Code:
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
Ich möchte nun statt mehrfachen Zeilen EFF_CRE_TS die Zeilen zählen und als Tage ausgeben. Als Beispiel:
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!

marabu 2. Aug 2006 16:20

Re: Hilfe bei Erstellung eines SQL-Statements
 
Hallo,

Zitat:

Zitat von barnti
Das Ergebnis liefert mehrere Zeilen, wo rqs.EFF_CRE_TS jeweils identich sind

mitnichten.

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

barnti 3. Aug 2006 07:35

Re: Hilfe bei Erstellung eines SQL-Statements
 
Hallo marabu
Zitat:

Zitat von marabu
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

Ersteinmal Danke! Ich weiß, das statement ist so noch nicht zu gebrauchen. Deshalb wende ich mich ja auch an dieses Forum.

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:
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
möchte ich:
Code:
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
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.
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?

barnti 3. Aug 2006 09:05

Re: Hilfe bei Erstellung eines SQL-Statements
 
Hallo noch ein Mal,

ich habe es zum Teil hinbekommen:
Code:
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
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.
Gibt es eine Möglichkeit, dieses in die Abfrage mitaufzunehmen?

marabu 3. Aug 2006 09:21

Re: Hilfe bei Erstellung eines SQL-Statements
 
Reicht da nicht schon die MIN() Funktion - nur in der Projektion, nicht in der GROUP-Klausel.

marabu

barnti 3. Aug 2006 09:58

Re: Hilfe bei Erstellung eines SQL-Statements
 
Hi marabu,
Zitat:

Zitat von marabu
Reicht da nicht schon die MIN() Funktion - nur in der Projektion, nicht in der GROUP-Klausel.

Sorry, das versteh ich nicht. Könntest Du Dich ein wenig ausführlicher erklären? Danke.

marabu 3. Aug 2006 11:09

Re: Hilfe bei Erstellung eines SQL-Statements
 
So war es gemeint:

SQL-Code:
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(*)  
...
marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz