Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datensatz immer ausgeben (https://www.delphipraxis.net/156407-datensatz-immer-ausgeben.html)

pustekuchen 1. Dez 2010 08:09

Datenbank: Firebird • Version: 2.5 • Zugriff über: isql.exe

Datensatz immer ausgeben
 
Guten Morgen,

ich bräuchte nochmal eure Hilfe ;)

Ich habe folgende Abfrage:
SQL-Code:
SELECT DISTINCT COUNT(gerichte.restaurant_id), restaurants.id
FROM restaurants,bestellungen,gerichte
WHERE bestellungen.gericht_id = gerichte.id
AND gerichte.restaurant_id = restaurants.id
AND bestellungen.datum = CURRENT_DATE
GROUP BY restaurants.id;
Ausgabe:
SQL-Code:
       COUNT          ID
============ ============
           3            1
           1            2
Diese gibt die Anzahl der Bestellunge der jeweiligen Restaurants aus.
Doch wenn es keine Bestellungen in einem Restaurant gibt, wird auch nichts ausgebeben.
Wie bekomm ich es nun hin, das für jede restaurant.id die Anzahl ausgegeben wird, auch wenn keine Bestellungen vorhanden sind.Also in diesem fall dann eine 0 oder Null.

Also folgendermaßen:
Ausgabe:
SQL-Code:
       COUNT          ID
============ ============
      0(NULL)           0
           3            1
           1            2
Ich habe schon einge Sachen versucht, doch leider find ich nicht den richtigen Weg :(
Gibt es evnt einen Parameter, der dies ermöglicht?
Danke schonmal für jede Hilfe ;)

pustekuchen 1. Dez 2010 08:20

AW: Datensatz immer ausgeben
 
Ich hab jetzt die Verarbeitung des Outputs geändert. Aber es würde mich trotzdem interessieren ob es möglich ist ;)

DeddyH 1. Dez 2010 08:21

AW: Datensatz immer ausgeben
 
Ungetestet:
SQL-Code:
SELECT COUNT(*), restaurants.id
FROM restaurants
LEFT JOIN gerichte ON gerichte.restaurant_id = restaurants.id
LEFT JOIN bestellungen ON bestellungen.gericht_id = gerichte.id
WHERE bestellungen.datum = CURRENT_DATE
GROUP BY restaurants.id;
[edit] In COUNT(*) geändert, siehe http://www.firebirdsql.org/manual/nu...-aggrfunc.html [/edit]

pustekuchen 1. Dez 2010 08:36

AW: Datensatz immer ausgeben
 
Mhh klappt leider nicht ;)
Kommt das gleiche wie bei mir raus.

joachimd 1. Dez 2010 08:52

AW: Datensatz immer ausgeben
 
poste mal kurz die DDL für Deine Tabellen. Macht das Nachbauen leichter;)

rapante 1. Dez 2010 09:00

AW: Datensatz immer ausgeben
 
imho, klappt der Vorschlag mit dem Left Join von DeddyH aufgrund des WHERE-Statements nicht.
(Weil für ein Restaurant ohne Einträge die Bedingung niemals wahr ist...?!)

DeddyH 1. Dez 2010 09:09

AW: Datensatz immer ausgeben
 
Guter Einwand. Dann versuchen wir es doch mal so:
SQL-Code:
SELECT COUNT(*), restaurants.id
FROM restaurants
LEFT JOIN gerichte ON gerichte.restaurant_id = restaurants.id
LEFT JOIN bestellungen ON bestellungen.gericht_id = gerichte.id
                       AND bestellungen.datum = CURRENT_DATE
GROUP BY restaurants.id
Ich bin aber im Moment anderweitig beschäftigt, kann mich daher nicht ausreichend mit dem Problem auseinandersetzen.

joachimd 1. Dez 2010 09:10

AW: Datensatz immer ausgeben
 
ok, habs nachgebaut. Was Du brauchst, ist ein outer join Deines Ergebnisses mit der restaurants-Tabelle:
SQL-Code:

SELECT a.*, b.Anzahl FROM
restaurants a
LEFT OUTER JOIN
(
SELECT DISTINCT COUNT(gerichte.restaurant_id) AS Anzahl, restaurants.id AS Id
FROM restaurants,bestellungen,gerichte
WHERE bestellungen.gericht_id = gerichte.id
AND gerichte.restaurant_id = restaurants.id
AND bestellungen.datum = CURRENT_DATE
GROUP BY restaurants.id
) b
on a.id=b.id

pustekuchen 1. Dez 2010 10:46

AW: Datensatz immer ausgeben
 
Hallo ;)

Sorry das ich mich erst so spät melde, hatte grade einiges zu tun ;)
Danke mal wieder an DeddyH für die bemühungen ;)

Und natürlich ein Danke an joachimd für den Lösungsweg ;)

Ich werd mir das jetzt mal genau anschauen, hatte mich noch nicht mit den Joins auseinandergesetzt, aber ich wußte das es i-wie geht :P

Gruß

Tyrolean 2. Dez 2010 08:08

AW: Datensatz immer ausgeben
 
Zitat:

Zitat von joachimd (Beitrag 1065317)
ok, habs nachgebaut. Was Du brauchst, ist ein outer join Deines Ergebnisses mit der restaurants-Tabelle:
SQL-Code:

SELECT a.*, b.Anzahl FROM
restaurants a
LEFT OUTER JOIN
(
SELECT DISTINCT COUNT(gerichte.restaurant_id) AS Anzahl, restaurants.id AS Id
FROM restaurants,bestellungen,gerichte
WHERE bestellungen.gericht_id = gerichte.id
AND gerichte.restaurant_id = restaurants.id
AND bestellungen.datum = CURRENT_DATE
GROUP BY restaurants.id
) b
on a.id=b.id

So müsste das doch auch gehen:

SQL-Code:
SELECT DISTINCT COUNT(gerichte.restaurant_id) AS Anzahl, restaurants.id AS Id
FROM restaurants,bestellungen,gerichte
WHERE bestellungen.gericht_id = gerichte.id
AND gerichte.restaurant_id = restaurants.id
AND (bestellungen.datum = CURRENT_DATE OR bestellungen.datum is null)
GROUP BY restaurants.id
Eventuell den count noch anpassen

Gruß
günter


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 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