Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage ich habs nicht drauf (https://www.delphipraxis.net/88879-sql-abfrage-ich-habs-nicht-drauf.html)

guidobrose 22. Mär 2007 14:03

Datenbank: mssql server • Zugriff über: ADO

SQL Abfrage ich habs nicht drauf
 
Folgendes Problem:

Tabelle A

Stellplatz Anzahl
1A 3
1B 2
2B 2

Tabelle B

Vorgang Stellplatz
Laden 1A
Laden 1B
Abladen 2B

Kurze Erklärung: Tabelle A enthält die verfügbaren Stellplatzbezeichnungen und die Anzahl der dort verfügbaren Stellplätze. Tabelle B enthält die Vorgänge und die zugeordneten Stellplätze, wobei es sein kann, dass ein Vorgang auf mehreren Stellplätzen möglich ist (z.B. Laden).

Für eine Übersicht benötigen ich jetzt ein Abfrageergebnis, das alle verfügbaren Stellplätze, mit Anzahl der Stellplätzen anzeigt und in einer zusätzlichen Spalte anzeigt, ob der Stellplatz für EINEN bestimmten Vorgang zulässig ist.

Also beispielsweise für den Vorgang Laden soll das Ergebnis so aussehen:

Stellplatz Anzahl Laden
1A 3 JA
1B 2 JA
2B 2 NEIN

Ob in der Spalte "Laden" "JA" oder "NEIN" steht oder 0/1 ist egal, die Tabelle wird eh grafisch aufbereitet.

Wie könnte eine SQL-Abfrage dafür aussehen und gibt es überhaupt eine?

Gruß,
Guido

alzaimar 22. Mär 2007 14:42

Re: SQL Abfrage ich habs nicht drauf
 
generell müsstest Du nur die Anzahl der möglichen Vorgänge *zählen* und dann ggf. aus Werten >1 eine 0 und bei einem Wert = 1 eine 1 daraus machen.

SQL-Code:
select A.StellPlatz,
       B.Anzahl,
       Sum (distinct B.Vorgang) as Summe
from A join B on A.StellPlatz = B.StellPlatz
Liefert Dir die Anzahl der möglichen Vorgänge pro Stellplatz. Entweder reicht dir das und Du verwuselst die 'Summe' selbst, oder Du verwendest eine Subquery, um das Ergebnis korrekt darzustellen


SQL-Code:
Select StellPlatz,
       Anzahl,
       Case When Summe = 1 Then 1 Else 0 End as Laden
From (
  select A.StellPlatz,
         B.Anzahl,
         Sum (distinct B.Vorgang) as Summe
  from A join B on A.StellPlatz = B.StellPlatz
) x
Du kannst in einem 'select' anstattt eines Tabellennames auch ein eigenes 'select' verwenden. Du musst es nur mit einem Namen versehen. Ich habe das Ding einfach 'x' genannt.

Catbytes 22. Mär 2007 14:53

Re: SQL Abfrage ich habs nicht drauf
 
So sollte es auch gehen:

SQL-Code:
SELECT TabelleA.Stellplatz, TabelleA.Anzahl,
Laden =
Case
WHEN TabelleB.Vorgang = 'Laden' THEN 'Ja'
WHEN TabelleB.Vorgang <> 'Laden' THEN 'Nein'
End
FROM TabelleA INNER JOIN TabelleB ON TabelleA.Stellplatz = TabelleB.Stellplatz
Order By TabelleA.Stellplatz;

Mr.Gogo 22. Mär 2007 15:02

Re: SQL Abfrage ich habs nicht drauf
 
So wie Catbytes habe ich es auch gelöst ist die beste und einfachste Variante

NormanNG 22. Mär 2007 15:35

Re: SQL Abfrage ich habs nicht drauf
 
Hi,
ich hab´ auch noch eine Variante:

SQL-Code:
select
  A.Stellplatz,
  A.Anzahl,
  Laden = count(b.vorgang)
from A
left join B on B.Stellplatz = A.Stellplatz and B.Vorgang = 'Laden'
group by a.Stellplatz, a.anzahl
order by a.stellplatz

guidobrose 22. Mär 2007 18:27

Re: SQL Abfrage ich habs nicht drauf
 
SUPER DANKE!

Ich habe jetzt alle Varianten durchprobiert und die von NormanNG liefert genau das Ergebnis, welches ich möchte. Danke dafür! Auch den anderen vielen Dank, ich habe auf jeden Fall einiges dabei gelernt.

Guido


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