Delphi-PRAXiS

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

joachimd 2. Dez 2010 09:34

AW: Datensatz immer ausgeben
 
Zitat:

Zitat von Tyrolean (Beitrag 1065566)
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

liefert in meiner Testumgebung auch nur 2 Restaurants, nicht alle drei;)
PS: Das ist meine Test-Datenbank (in ADS):
SQL-Code:
create table restaurants(id integer, name cichar(30));
create table gerichte(id integer, restaurant_id integer, name cichar(30));
create table bestellungen(id integer,gericht_id integer, datum date);

insert into restaurants values(1,'Löwen');
insert into restaurants values(2,'Ochsen');
insert into restaurants values(3,'Sonne');

insert into gerichte values(1,1,'Braten');
insert into gerichte values(2,1,'Schnitzel');
insert into gerichte values(3,2,'Eintopf');
insert into gerichte values(4,2,'Suvlaki');
insert into gerichte values(5,3,'Pommes');
insert into gerichte values(6,3,'Currywurst');

insert into bestellungen values(1,1,curdate());
insert into bestellungen values(2,2,curdate());
insert into bestellungen values(3,3,curdate());

jobo 2. Dez 2010 10:19

AW: Datensatz immer ausgeben
 
Wenn die Restaurants nicht extra ausgewertet werden (mit outer join), können die leeren auch nicht auftauchen. Dein erstes Beispiel war gut.

rokli 2. Dez 2010 11:10

AW: Datensatz immer ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

beim Microsoft SQL Server gibts den Befehl COALESCE

Abfrage 1:

SELECT smiGkLage FROM tblTest

Das Ergebnis siehst Du in Ergebnis1.JPG

Abfrage 2:

SELECT COALESCE(smiGkLage, -1) FROM tblTest

Das Ergebnis wird durch COALSECE so manipuliert, dass wenn das Ergebnis NULL ist, der 2. Wert in der Klammer eingesetzt wird. (siehe Ergebnis2.jpg)

Vielleicht gibst in Deiner DB auch so eine Möglichkeit

Gruß
Rolf

jobo 2. Dez 2010 12:07

AW: Datensatz immer ausgeben
 
Coalesce ist manchmal nützlich, aber nicht, wenn man gar keinen Datensatz hat.
Die Anforderung war, "Datensatz immer ausgeben", nicht "Feld immer anzeigen".

Ein Datensatz wird immer ausgegeben, wenn alle where - Bedingungen passen, ob aus einem Join oder wie auch immer. Das Beispiel von Joachim zeigt das ja schon.

Tyrolean 2. Dez 2010 13:36

AW: Datensatz immer ausgeben
 
So gehts bei mir nun auch

SQL-Code:
SELECT DISTINCT
  Sum(case when bestellungen.datum is null then 0 else 1 end) AS Anzahl,
  restaurants.id AS Id
FROM restaurants,gerichte
left outer join bestellungen on bestellungen.gericht_id = gerichte.id
WHERE
gerichte.restaurant_id = restaurants.id
AND (bestellungen.datum = CURRENT_DATE() OR bestellungen.datum is null)
GROUP BY restaurants.id


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