AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Select mit widersprüchlichen where-Anweisungen

Select mit widersprüchlichen where-Anweisungen

Ein Thema von Ykcim · begonnen am 11. Jul 2013 · letzter Beitrag vom 11. Jul 2013
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#1

Select mit widersprüchlichen where-Anweisungen

  Alt 11. Jul 2013, 17:33
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
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
Miniaturansicht angehängter Grafiken
tabelle.jpg  
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
799 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Select mit widersprüchlichen where-Anweisungen

  Alt 11. Jul 2013, 17:54
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
Miniaturansicht angehängter Grafiken
tabelle2.jpg  
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Select mit widersprüchlichen where-Anweisungen

  Alt 11. Jul 2013, 18:00
Also so wie ich das sehe solltest du einen 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.
fork me on Github
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Select mit widersprüchlichen where-Anweisungen

  Alt 11. Jul 2013, 18:07
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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