AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL KnowHow fehlt

Ein Thema von p80286 · begonnen am 19. Aug 2010 · letzter Beitrag vom 19. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

SQL KnowHow fehlt

  Alt 19. Aug 2010, 11:45
Datenbank: oracle • Version: 9 • Zugriff über: egal
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von mkinzler (19. Aug 2010 um 12:14 Uhr) Grund: Code-Tags durch SQL-Tags ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 12:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 13:10
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von mkinzler (19. Aug 2010 um 13:42 Uhr) Grund: Code-tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 13:36
@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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#5

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 13:47
Mit zwei selects erhalte ich zunächst zwei Ergebniszeilen, Du glaubst doch nicht, daß damit meine Vorgesetzten zufrieden sind (ich bin doch nicht SAP)
Und was spricht dagegen, die Ergebnisse der beiden Abfragen einfach zu JOINen? Dann hast du als Ergebnis eine Zeile mit zwei Spalten...
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 13:49
Zitat:
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 14:04
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#8

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 14:08
[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 ):
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:
Was mir noch einfiele (keine Ahnung, ob das funktioniert):
[...]
Jo, wie gesagt: Die zwei Einzelabfrage joinen
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;

Geändert von leddl (19. Aug 2010 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#9

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 14:10
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
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;

Geändert von leddl (19. Aug 2010 um 14:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: SQL KnowHow fehlt

  Alt 19. Aug 2010, 14:45
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von mkinzler (19. Aug 2010 um 16:09 Uhr) Grund: Code-Tag durch SQL-Tag ersetzt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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