java-forum.org
JBoss Seam
Alter Preis: 39,95 €
Jetzt: 0,00 €

zzgl. Versandkosten

Zurück   java-forum.org > Java - Programmierung > Datenbankprogrammierung

Datenbankprogrammierung Fragen zur Anbindung und Programmierung von Datenbanken bzw. Datenbankabfragen

Antwort     Ist dieses Thema erledigt?
Themen-Optionen Thema durchsuchen Ansicht
Alt 15.03.2010, 10:23   #1 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 13.07.2009
Beiträge: 113
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
Standard SQL Problem mit Count + Group By

Hallo zusammen,

aus einer Java Anwendung schicke ich SQL Abfragen zum Zählen von Werten auf eine Datenbank.

Jetzt möchte ich aber z.B. nur ungern 5 einzelne Abfragen abschicken:
Java Code: Quelltext in neuem Fenster öffnen
1
2
3
4
5
String abfrage1 = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank = 1;
String abfrage2 = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank = 2;
String abfrage3 = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank = 3;
String abfrage4 = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank = 4;
String abfrage5 = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank = 5;

sondern eine Abfrage mit Group By verwenden:
Java Code: Quelltext in neuem Fenster öffnen
1
String abfrage = SELECT COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank < 6 GROUP BY neu.rank;

Problem ist nun, dass, falls in einer Gruppe 0 Werte vorkommen, nicht 5 Ergebnisse, sondern nur 4 zurückgeliefert werden. Ist es möglich, auch eine 0 zurückzubekommen? Für eine Weiterverarbeitung wäre es nötig / hilfreich, wenn die Rückgabe immer die gleiche Form / Struktur hat.

Ich weiß, es ist mehr eine SQL Frage... hoffe, dass sich trotzdem der ein oder andere hier damit besser auskennt.

Danke und Gruß,
Jens

Geändert von Jens81 (15.03.2010 um 10:36 Uhr)
Jens81 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 10:39   #2 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Beiträge: 20.026
Abgegebene Danke: 0
Erhielt 426 Danke für 423 Beiträge
eine Idee:
du bräuchtest eine Dummy-Tabelle mit Einträgen 1-n,
dann ein left join darüber

-----

so wie du die Abfrage bisher hast, ist die Reihenfolge nicht gesichert, noch ein ORDER BY?
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 11:45   #3 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 08.12.2006
Beiträge: 460
Abgegebene Danke: 0
Erhielt 58 Danke für 56 Beiträge
Guck dir das mal an: SQL COUNT( NULLIF( .. ) ) Is Totally Awesome
__________________
Hi, my name is not Lance and i'm not an addict!
fassy ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 11:54   #4 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 13.07.2009
Beiträge: 113
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
Stimmt, das ORDER BY fehlte natürlich noch. Die Lösung mit der Dummy Tabelle ist möglich, aber nicht wirklich schön...

Zitat: fassy
Beitrag anzeigen
Ich glaube, dass hilft hier leider nicht weiter. Das Problem ist ja nicht, dass Missing Values nicht mitgezählt werden, sondern dass aufgrund der WHERE Bedingung (in bestimmten Konstellationen) keine 5 Gruppen zustande kommen.

Wenn es für jede Gruppe Treffer gibt, sieht das Ergebnis z.B. so aus (via Group by Abfrage):
987985
200341
189112
98552
19244

Gibt es aber nicht immer in jeder Gruppe Treffer, könnte auch mal sowas bei raus kommen:
1200921
378871
10923

Nun weiß ich nicht, welches die 2 leeren Gruppen sind...

Geändert von Jens81 (15.03.2010 um 12:04 Uhr)
Jens81 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 12:31   #5 (permalink)
Stammbenutzer
Kilobyte
 
Registriert seit: 08.12.2006
Beiträge: 460
Abgegebene Danke: 0
Erhielt 58 Danke für 56 Beiträge
Dann gib doch die Gruppe mit aus:

Java Code: Quelltext in neuem Fenster öffnen
1
String abfrage = SELECT neu.rank, COUNT(1) FROM tab1 as alt, tab2 as neu WHERE alt.KDNR = neu.KDNR AND alt.rank = 1 AND neu.rank < 6 GROUP BY neu.rank;

Das Problem ist wirklich das da schon viel wegoptimiert wird... Kannst mit Subselects oder UNION arbeiten wenn du eine feste Menge an Gruppen hast. - Dann halt für jeden Subselect gucken ob es eine Ergebniss hat sonst 0 setzen.
__________________
Hi, my name is not Lance and i'm not an addict!
fassy ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 12:53   #6 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 13.07.2009
Beiträge: 113
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
So wie es ausschaut, werde ich mir die Gruppe mit ausgeben, die leeren / fehlenden Datensätze im Programm ergänzen und die Ergebnisse dann zur Verarbeitung weiterreichen. Scheint dann wohl die performanteste Lösung zu sein.

Hatte gehofft, dass es noch eine (einfache) Möglichkeit gibt, alles im SQL Statement zu lösen. Vielen Dank für eure Ratschläge!
Jens81 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 13:07   #7 (permalink)
Stammbenutzer
Kilobyte
Themenstarter
 
Registriert seit: 13.07.2009
Beiträge: 113
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
Eine ergänzende Frage habe ich allerdings noch:

Wenn man alt.rank nicht nur bei 1 belassen möchte, sondern diesen auch bis 5 hochzählt, ist das in einer Abfrage machbar? (= 25 Ergebnisse, wenn alle Gruppen vorhanden)

Gibts sowas wie eine Schleife? oder via Subquery?
Jens81 ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Alt 15.03.2010, 13:12   #8 (permalink)
Java-Forum Team
Moderator
 
Benutzerbild von SlaterB
 
Registriert seit: 13.11.2005
Beiträge: 20.026
Abgegebene Danke: 0
Erhielt 426 Danke für 423 Beiträge
ist mir bisher nicht begegnet, bin immer noch für Dummy-Tabelle,
dort ein Join, schon hast du 25 Elemente voreingestellt,
wobei ich das nur theoretisch so sehe,
4 joins teils verschiedener Arten, bestimmt ne Menge zu basteln falls es überhaupt geht
__________________
Hansa wird Meister.
SlaterB ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten
Antwort     Ist dieses Thema erledigt?

Lesezeichen

Latex Maths & Physics Editor ...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Group By gast Datenbankprogrammierung 1 22.10.2008 09:41
Problem mit einer SQL Datenbank firestone Java Basics - Anfänger-Themen 1 17.10.2007 17:58
Byte auslesen mit MS SQL Server thE_29 Datenbankprogrammierung 4 26.09.2007 17:05
SWT: Group Scrollbar machen. Aimee AWT, Swing & SWT 5 07.09.2006 12:12
sql abfrage sortiert nach count in anderer tabelle Illuvatar Softwareentwicklung 6 10.06.2006 00:36


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:01 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de