Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Null (https://www.delphipraxis.net/134934-sql-liefert-bei-union-kein-ergebnis-wenn-ergebnis-%3D-null.html)

Chaoten-Joe 1. Jun 2009 22:40

Datenbank: Paradox • Zugriff über: BDE

SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Null
 
Hallo zusammen,

habe schon verschiedene Beiträge zu meinem Problem nachgelesen, aber nichts gefunden, was irgendwie passte oder umsetzbar war. Es geht um folgendes:
Ich habe eine Tabelle mit Projekten, in denen unter anderem vermerkt ist, ob es aktiv ist und seit wann die Planungen laufen. Ich möchte in einem DBChart darstellen:
  • alle aktiven Projekte, vor weniger als einem Jahr begonnen
  • alle aktiven Projekte, vor mehr als einem Jahr begonnen
  • alle inaktiven Projekte, vor weniger als einem Jahr begonnen
  • alle inaktiven Projekte, vor mehr als einem Jahr begonnen

Die Abfrage mache ich mittels SQL und Union. Das Problem ist nur, wenn bei einer der vier Abfragen die Ergebnismenge Null ist, wird nicht Null ausgegeben, sonden eben gar nichts. Es könnte (und wird) also sein, dass weniger als 4 Ergebnisse vorliegen ... nur wie bekomme icrh heraus, welche der vier Abfragen kein Ergebnis lieferte?

Delphi-Quellcode:
Select Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung <= '+QuotedStr(DateToStr(Date-365))+' and Aktiv = "True"
UNION Select Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung <= '+QuotedStr(DateToStr(Date-365))+' and Aktiv = "False"
UNION Select Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung > '+QuotedStr(DateToStr(Date-365))+' and Aktiv = "True"
UNION Select Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung > '+QuotedStr(DateToStr(Date-365))+' and Aktiv = "False"
Bekomme ich nicht heraus, welche der vier Abfragen die Nullmege(n) entält/enthalten, kann ich die Beschriftungen beim DBChart nicht korrekt setzen.

Die Lösung ist wahrscheinlich ganz banal. Habe auch schon mit INNER JOIN probiert, aber nix gut.

Vielen Dank vorab!

mkinzler 1. Jun 2009 22:43

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Versuch es mal mit (SQL-)Parametern

Chaoten-Joe 1. Jun 2009 22:49

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Kann ich mit Parametern beeinflussen, ob die Ergebnismenge ausgegeben wird, auch wenn sie Null ist? Hast du einen Ansatz? Danke!

mkinzler 1. Jun 2009 23:01

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Das scheint eher ein Problem von Paradox (der BDE) zu sein. Mit parametern würdest dur das DateToStr() und das Quoten Sparen.

Die Abfrage an sich sollte aber funktionieren
SQL-Code:
Select
    Count(Bearbeitung) AS Anzahl,
FROM
    Projekte
WHERE
    Bearbeitung <= :Datum and Aktiv = "True"
UNION
Select
    Count(Bearbeitung) AS Anzahl
FROM
    Projekte
WHERE
    Bearbeitung <= :datum and Aktiv = "False"
...
Delphi-Quellcode:
DataSet.ParamByName('Datum').Value := IncYear( Date(), -1);

omata 2. Jun 2009 00:50

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Erweitere doch deine Abfrage durch eine neue Spalte, die angibt, welcher Wert in der Zeile zurückgegeben wird...
SQL-Code:
  SELECT 'A' typ, COUNT(Bearbeitung) AS Anzahl
  FROM Projekte
  WHERE Bearbeitung <= :datum
    AND Aktiv = "True"
UNION
  SELECT 'B' typ, COUNT(Bearbeitung) AS Anzahl
  FROM Projekte
  WHERE Bearbeitung <= :datum
    AND Aktiv = "False"
UNION
  SELECT 'C' typ, COUNT(Bearbeitung) AS Anzahl
  FROM Projekte
  WHERE Bearbeitung > :datum
    AND Aktiv = "True"
UNION
  SELECT 'D' typ, COUNT(Bearbeitung) AS Anzahl
  FROM Projekte
  WHERE Bearbeitung > :datum
    AND Aktiv = "False"
Eine andere Variante ist folgende...
SQL-Code:
SELECT SUM(CASE WHEN Bearbeitung <= :datum AND Aktiv = "True" THEN 1 ELSE 0 END) A,
       SUM(CASE WHEN Bearbeitung <= :datum AND Aktiv = "False" THEN 1 ELSE 0 END) B,
       SUM(CASE WHEN Bearbeitung > :datum AND Aktiv = "True" THEN 1 ELSE 0 END) C,
       SUM(CASE WHEN Bearbeitung > :datum AND Aktiv = "False" THEN 1 ELSE 0 END) D
FROM Projekte
Ob das aber auch mit Paradox funktioniert weiss ich nicht.

Chaoten-Joe 2. Jun 2009 06:18

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Vielen Dank für die Antworten. Klappt leider alles nicht ... liegt am eingeschränkten Befehlssatz von LocalSQL. Da gibts zum Beispiel auch kein CASE. Auch "frei definierte Textspalten" ('A' typ) gibt es nicht in verschachtelten Abfragen. Alles etwas blöd. Das Programm ist eines meiner ersten aus dem Jahre 1998 oder so. Von daher hat es noch die recht eingeschränkte Paradox-Datenbank und ich will nicht alles "ummodeln".

Hat jemand noch eine Idee? Etwas, was auch bei 0815-Paradox noch klappen könnte?

Liebe Grüße
Chaoten-Joe

Bernhard Geyer 2. Jun 2009 06:40

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Zitat:

Zitat von Chaoten-Joe
Von daher hat es noch die recht eingeschränkte Paradox-Datenbank und ich will nicht alles "ummodeln".

Es gibt einige Kompos die auch ohne BDE auf Paradox zugreifen können. Das "ummodeln" umfaßt also nicht alles. Aber BDE ist nunmal schon seit über 10 Jahren eine abgekündigte Technik.

Chaoten-Joe 2. Jun 2009 06:46

Re: SQL liefert bei UNION kein Ergebnis, wenn Ergebnis = Nul
 
Voll fett krass! Eure Tipps waren Gold wert! Baue ich noch GROUP BY ein, klappt es:
Delphi-Quellcode:
Select 'A' Typ, Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung <= :Datum and Aktiv = True
GROUP BY Aktiv
UNION Select 'B' Typ, Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung <= :Datum and Aktiv = False
GROUP BY Aktiv
UNION Select 'C' Typ, Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung > :Datum and Aktiv = True
GROUP BY Aktiv
UNION Select 'D' Typ, Count(Bearbeitung) AS Anzahl
FROM Projekte
WHERE Bearbeitung > :Datum and Aktiv = False
GROUP BY Aktiv
Vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz