Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Select mit widersprüchlichen where-Anweisungen (https://www.delphipraxis.net/175719-select-mit-widerspruechlichen-where-anweisungen.html)

Ykcim 11. Jul 2013 16:33

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

Select mit widersprüchlichen where-Anweisungen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

ich habe eine Abfrage zu generieren, in der ich Daten nach unterschiedlichen, sich zum Teil widersprechenden Bedingungen zusammenfassen muss. Hier mal ein aller erster Ansatz meine Abfrage:
Delphi-Quellcode:
select hlp_branchen.branche_text as Branchen, Count(anfrage_id) as Auftrag from anfragen left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche where feedback=10 and branche=1
union
select hlp_branchen.branche_text as Branchen, Count(anfrage_id) as Auftrag from anfragen left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche where feedback=10 and branche=2
union
select hlp_branchen.branche_text as Branchen, Count(anfrage_id) as Auftrag from anfragen left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche where feedback=10 and branche=3
In dem angefügten Screenshot könnt Ihr sehen, wie die Tabelle nachher aussehen soll.
Mein Problem ist, dass sich die where-Bedingungen widersprechen. In der zweiten Spalte "Anzahl Anfragen" möchte ich die Anzahl alle Anfrage dieser Branchen haben-
in der nächsten Splate nur die Anfragen dieser Branche, wo wir den Auftrag erhalten haben (Feedback=10) - dann die Anzahl der Anfragen, wo wir zu teuer waren (Feedback=9)...

Ich nehme mal an, dass ich irgendwie mit Indixen arbeiten muss, habe nur keine Vorstellung, wie ich das anstellen soll...

Das zweite Problem ist, dass in der Tabelle (Screenshot) die Branche mit "NULL" angegeben wird, weil die Bedingung (Feedback=10) nicht erfüllt ist. Ich möchte aber, dass dann da trotzdem "OEM" drinsteht.

Ich hoffe, ich konnte die Probleme verständlich erklären und das Ihr mir helfen könnt.

Vielen Dank
Patrick

Ykcim 11. Jul 2013 16:54

AW: Select mit widersprüchlichen where-Anweisungen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, ich glaube, dass ich es gerade mit der Hilfe aus einem Threat zu einem ähnlichen Thema selbst gelöst habe.
Ist diese Lösung für die Experten nachvollziehbar?

Delphi-Quellcode:
select hlp_branchen.branche_text as Branchen, Count(A2.anfrage_ID) as 'Anzahl Anfragen der Branche',
       Count(A0.anfrage_id) as 'Anzahl Aufträge der Branche', Count(A4.anfrage_ID) as 'zu teuer der Branche',
       Count(A1.anfrage_id) as 'kein Feedback der Branche' from anfragen
left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche
left join anfragen as A0 on A0.anfrage_ID=anfragen.anfrage_id and A0.Feedback=10
left join anfragen as A4 on A4.anfrage_ID=anfragen.anfrage_id and A4.Feedback=9
left join anfragen as A1 on A1.anfrage_ID=anfragen.anfrage_id and A1.Feedback is null
left join anfragen as A2 on A2.anfrage_ID=anfragen.anfrage_id
where anfragen.branche=1

union

select hlp_branchen.branche_text as Branchen, Count(A2.anfrage_ID) as 'Anzahl Anfragen der Branche',
       Count(A0.anfrage_id) as 'Anzahl Aufträge der Branche', Count(A4.anfrage_ID) as 'zu teuer der Branche',
       Count(A1.anfrage_id) as 'kein Feedback der Branche' from anfragen
left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche
left join anfragen as A0 on A0.anfrage_ID=anfragen.anfrage_id and A0.Feedback=10
left join anfragen as A4 on A4.anfrage_ID=anfragen.anfrage_id and A4.Feedback=9
left join anfragen as A1 on A1.anfrage_ID=anfragen.anfrage_id and A1.Feedback is null
left join anfragen as A2 on A2.anfrage_ID=anfragen.anfrage_id
where anfragen.branche=2

union

select hlp_branchen.branche_text as Branchen, Count(A2.anfrage_ID) as 'Anzahl Anfragen der Branche',
       Count(A0.anfrage_id) as 'Anzahl Aufträge der Branche', Count(A4.anfrage_ID) as 'zu teuer der Branche',
       Count(A1.anfrage_id) as 'kein Feedback der Branche' from anfragen
left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche
left join anfragen as A0 on A0.anfrage_ID=anfragen.anfrage_id and A0.Feedback=10
left join anfragen as A4 on A4.anfrage_ID=anfragen.anfrage_id and A4.Feedback=9
left join anfragen as A1 on A1.anfrage_ID=anfragen.anfrage_id and A1.Feedback is null
left join anfragen as A2 on A2.anfrage_ID=anfragen.anfrage_id
where anfragen.branche=3
Vielen Dank
Patrick

sx2008 11. Jul 2013 17:00

AW: Select mit widersprüchlichen where-Anweisungen
 
Also so wie ich das sehe solltest du einen
SQL-Code:
GROUP BY branche
ausführen.

Etwa so:
SQL-Code:
SELECT branche, Count(*) as Anzahl from anfragen
WHERE feedback = 10
GROUP BY branche
Jetzt hast du die Branche zwar nur als Zahlenwert, aber das ist kein Problem, denn man kann den Text aus Tabelle "hlp_branchen" rausholen:
SQL-Code:
SELECT SubTbl.*, hlp_branchen.branche_text as Branchen FROM
(
SELECT branche, Count(*) as Anzahl from anfragen
WHERE feedback = 10
GROUP BY branche) SubTbl
INNER JOIN hlp_branchen ON SubTbl.branche=hlp_branchen.branchen_id
Die Abfrage in den runden Klammern wie zu "SubTbl" umbenannt, damit man entsprechend verjoinen kann.

nahpets 11. Jul 2013 17:07

AW: Select mit widersprüchlichen where-Anweisungen
 
vermutlich meinst Du sowas in dieser Art:
Code:
select Branche, Sum(Feedback_10) as Feedback_10, Sum(Feedback_9) as Feedback_10 from (
  select hlp_branchen.branche_text as Branchen, Count(anfrage_id) as Feedback_10, 0 as Feedback_9
  from anfragen
  left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche
  where feedback=10 and branche in (1,2,3)
  union
  select hlp_branchen.branche_text as Branchen, 0 as Feedback_10, Count(anfrage_id) as Feedback_9
  from anfragen
  left join hlp_branchen on hlp_branchen.branchen_id=anfragen.branche
  where feedback=9 and branche in (1,2,3)
)
group by Branche
Du benötigst hierfür also im Ergebnis zuerst mehr Spalten, als Du im Ergebnis eigentlich ermitteln kannst. Zuerst holst Du daher die Daten für die erste Spalte und füllst die übrigen Spalten mit 0.
Dann holst Du das Ergebnis für die zweite Spalte und füllst die übrigen Spalten mit 0.
Dies kannst Du für beliebig viele Spalten machen. Die einzelnen Ergebnisse werden mit Union zusammengefügt.

Über diese mit Union zusammengefügten Ergebnismengen legst Du nun ein weiteres Select-Statement, das Dir die Spalten der Einzelergebnisse zusammenfasst. Dies kannst Du wahlweise mit Max oder Sum erledigen, da Du bei den Einzelergebnissen für jede Kombination aus Branche und Feedback ja nur einen Wert hast und der Rest mit 0 gefüllt wurde.
Das Ergebnis musst Du dann bein Summieren nur (per Group by) auf Branche gruppieren.

Danach solltest Du für jede Branche die gewünschten Werte nebeneinander in der Tabelle vorfinden.

Wenn ich das richtig sehe, dürfte Deine Lösung auch zum gewünschten Ergebnis führen.


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