Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL KnowHow fehlt (https://www.delphipraxis.net/153892-sql-knowhow-fehlt.html)

p80286 19. Aug 2010 10:45

Datenbank: oracle • Version: 9 • Zugriff über: egal

SQL KnowHow fehlt
 
Hallo zusammen,
ich muß aus einer Ereignis-Tabelle zwei Zahlen generieren, die Anzahl jedes Ergeignisses total und die Anzahl in 2010.
folgende Möglichkeit habe ich ausprobiert
SQL-Code:
select count(erg1.Ergdatid) Z2010,count(Ergdate.Ergdatid) Ztotal
from Ergname
    ,Ergdate
    ,Ergdate erg1
where Ergname.ErgNid=Ergdate.ErgNid(+)
  and Ergname.ErgNid=Erg1.ErgNid(+)
  and Erg1.ErgDat>to_date('20091231','YYYYMMDD')
SQL-Code:
select count(erg1.Ergdatid) Z2010,count(Ergdate.Ergdatid) Ztotal
from Ergname
    ,Ergdate
    ,(select ergdatid,Ergdatid from Ergdate where Ergdate.ErgDat>to_date('20091231','YYYYMMDD') erg1
where Ergname.ErgNid=Ergdate.ErgNid(+)
  and Ergname.ErgNid=Erg1.ErgNid(+)
in beiden Fällen scheint die Abfrage in einer Endlosschleife zu versinken,
ich habe mir jetzt mit einer Union-Abfrage beholfen, aber zufriedenstellend ist das nicht.

Habt Ihr eine Idee wie ich es richtig machen könnte?

Gruß
K-H

ULIK 19. Aug 2010 11:57

AW: SQL KnowHow fehlt
 
Also wenn ich Dich richtig verstehe, dann kann das mit einer Abfrage nicht gehen:

z.B.
Alle Ereignisse = 100 Stück
alle Ereignisse in 2010 = 10 Stück

Wenn es nun mit einen Ruck gehen sollte: dann müßte die where-Bedingung für den ersten Teil 100 Treffer liefern (damit auch count), dürfte aber gleichzeitig für den zweiten Teil nur 10 Treffer liefern. Das kann nicht gehen.
Deine Outer Joins bewirken nur, daß wohl große Datenmengen generiert werden und so ziemlich kein Index greifen dürfte.

Was spricht gegen zwei einzelne Selects?


Grüße,
Uli

Bummi 19. Aug 2010 12:10

AW: SQL KnowHow fehlt
 
Ich kenn mich mit den Möglichjkeiten in Oracel nicht aus und bin nicht sicher ob ich Dich richtig verstanden habe, meinst Du so etwas?
SQL-Code:
Select SUM(Case when Per=9 then 1 else 0 end) as SummeMonat9,Count(*) from [dbo].[V_KBK]
Where Jahr=2007

p80286 19. Aug 2010 12:36

AW: SQL KnowHow fehlt
 
@Bummi Nein, das ist es nicht, da in Deiner Lösung nur das Jahr 2007 berücksichtigt wird, ich aber etwas in der Art von "im Jahr 2007 von allen"

@ULIK Warum sollte es nicht gehen? Die Abfrage baut ja auf 3 Tabellen auf, einmal die Jahreswerte, dann alle Werte und letztendlich die Namen und wenn es keinen Jahreswert gibt dann ist count halt 0.
Mit zwei selects erhalte ich zunächst zwei Ergebniszeilen, Du glaubst doch nicht, daß damit meine Vorgesetzten zufrieden sind (ich bin doch nicht SAP)

Gruß
K-H

leddl 19. Aug 2010 12:47

AW: SQL KnowHow fehlt
 
Zitat:

Zitat von p80286 (Beitrag 1043358)
Mit zwei selects erhalte ich zunächst zwei Ergebniszeilen, Du glaubst doch nicht, daß damit meine Vorgesetzten zufrieden sind (ich bin doch nicht SAP)

:gruebel: Und was spricht dagegen, die Ergebnisse der beiden Abfragen einfach zu JOINen? Dann hast du als Ergebnis eine Zeile mit zwei Spalten...

p80286 19. Aug 2010 12:49

AW: SQL KnowHow fehlt
 
Zitat:

:gruebel: Und was spricht dagegen, die Ergebnisse der beiden Abfragen einfach zu JOINen? Dann hast du als Ergebnis eine Zeile mit zwei Spalten...
Ähhhh wie?

Gruß
K-H

DeddyH 19. Aug 2010 13:04

AW: SQL KnowHow fehlt
 
Was mir noch einfiele (keine Ahnung, ob das funktioniert):
SQL-Code:
SELECT
  A.Summe, B.Summe
FROM
  (SELECT COUNT(*) AS Summe
   FROM ...
   WHERE ...) A,
  (SELECT COUNT(*) AS Summe
   FROM ...
   WHERE ...) B

leddl 19. Aug 2010 13:08

AW: SQL KnowHow fehlt
 
[QUOTE=p80286;1043363]
Zitat:

Ähhhh wie?
Zum Bleistift so (in Oracle kenne ich mich nicht aus, daher so, wie ichs in MS SQL gemacht hätte, kA ob das ein großer Unterschied ist :mrgreen:):
SQL-Code:
select
   a.cnt as Anzahl,
   b.cnt as Anzahl2010
From
(select
   COUNT(*) as cnt
from
   ErgName n inner join ErgDate d on
   n.ErgID = d.ErgID) a

cross join

(select
   COUNT(*) as cnt
from
   ErgName n inner join ErgDate d on
   n.ErgID = d.ErgID
where YEAR(d.ErgDate) = 2010) b
Mal ganz davon abgesehen davon, dass ich gar nicht verstehe, warum der join zwischen ErgName und ErgDate überhaupt gemacht wird... du könntest ja auch gleich die IDs in ErgDate zählen.

Evtl ginge es auch so:
SQL-Code:
select
   SUM(Anzahl) as Anzahl, SUM(Anzahl_2010) as Anzahl_2010
From
(select
   YEAR(ErgDat) as Jahr,
   COUNT(ErgID) as Anzahl,
   case when YEAR(Ergdate) = 2010 then COUNT(ErgID) else 0 as Anzahl_2010
From ErgDate
group by YEAR(ErgDat), COUNT(ErgID)) a
//Edit:
Zitat:

Zitat von DeddyH (Beitrag 1043370)
Was mir noch einfiele (keine Ahnung, ob das funktioniert):
[...]

Jo, wie gesagt: Die zwei Einzelabfrage joinen :mrgreen:

leddl 19. Aug 2010 13:10

AW: SQL KnowHow fehlt
 
Hupsa, ich bin das neue Forum wohl noch nicht ganz gewöhnt... man sollte schon auch auf Bearbeiten drücken, wenn man editieren will, statt zu zitieren :mrgreen:

p80286 19. Aug 2010 13:45

AW: SQL KnowHow fehlt
 
Vielen Dank!

Jetzt ist das dabei heraus gekommen (da muß ich aus null noch 0 machen), ist aber eine Zeile mit zwei "Zählspalten"

SQL-Code:
select tab1.wert1,tab1.wert2....,z2010,ztotal
from tab1
    ,(select tab2.id1, count(ide) ztotal from tab2 .....) tbs1
    ,(select tab2.id1, count(ide) z2010 from tab2 where datum>to_date('20091231','YYYYMMDD').....) tbs2
where tab1.id2=tbs1.id1(+)
  and tab1.id2=tbs2.id1(+)
und "Entschuldigung", die Werte, die aus der 1. Tabelle (namen) stammen hatte ich unterschlagen, weil sie nichts mit dem Problem zu tun hatten.

Vielen Dank nochmal

K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr.
Seite 1 von 2  1 2      

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