Wie löst man die folgende SQL Abfrage?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Es gibt verschiedene Möglichkeiten:

SELECT DISTINCT Kunde.Name, Kunde.PaybackPunkte, Kunde.PaybackPunkte/COUNT(Kunde.id) as Durchschnitt FROM Kunde WHERE Durchschnitt<Kunde.PaybackPunkte ORDER BY Kunde.Name;
SELECT DISTINCT Name FROM
(
  SELECT k.Name as Name, k.PaybackPunkte as PunkteKunde, k1.PaybackPunkte AS PunkteMax
  FROM Kunde k
  LEFT OUTER JOIN Kunde k1 ON k1.Name = 'Maximilian Durchschnittsbürger'
) tmp
WHERE PunkteKunde > PunkteMax

SELECT DISTINCT Name 
FROM Kunde k 
WHERE k.PaybackPunkte > (SELECT TOP 1 PaybackPunkte FROM Kunde k1 WHERE k1.Name = 'Maximilian Durchschnittsbürger')

Woher ich das weiß:Studium / Ausbildung
ohwehohach  30.06.2020, 10:08

Wow, echt jetzt? Du kopierst nicht nur meine Lösung, sondern auch noch die falsche Lösung von lateinfreak und gibst das als eigene Antwort aus? Das ist nun wirklich mutig...

3
Dultus, UserMod Light   30.06.2020, 10:17
@ohwehohach

Guck dir seine Antworten an. Er liest sie von anderen Leuten und antwortet dann, indem er so tut, als wüsste er es... Traurig trifft es wohl eher als mutig. ^^'

2

Ich wundere mich über die Frage, denn es können ja (wie man auch am Datenmodell sieht) explizit unterschiedliche Personen mit demselben Namen vorkommen. Aber gut. Das folgende würde vermutlich in T-SQL klappen (habe es nicht probiert), aber sollte sich entsprechend auch auf andere Dialekte übertragen lassen:

SELECT DISTINCT Name 
FROM Kunde k 
WHERE k.PaybackPunkte > (SELECT TOP 1 PaybackPunkte FROM Kunde k1 WHERE k1.Name = 'Maximilian Durchschnittsbürger')

Das ist die "Straight-Forward-Lösung". Eine andere wäre:

SELECT DISTINCT Name FROM
(
  SELECT k.Name as Name, k.PaybackPunkte as PunkteKunde, k1.PaybackPunkte AS PunkteMax
  FROM Kunde k
  LEFT OUTER JOIN Kunde k1 ON k1.Name = 'Maximilian Durchschnittsbürger'
) tmp
WHERE PunkteKunde > PunkteMax

Das erzeugt eine temporäre Tabelle mit drei Spalten: Dem Namen des Kunden, seinen Punkten und den Punkten von Maximilian. Aus dieser Zwischentabelle liefert es die Namen, deren Punktzahl größer ist.

SELECT DISTINCT Kunde.Name, Kunde.PaybackPunkte, Kunde.PaybackPunkte/COUNT(Kunde.id) as Durchschnitt FROM Kunde WHERE Durchschnitt<Kunde.PaybackPunkte ORDER BY Kunde.Name;

Ich denke ich habe es gelöst... Konnte es natürlich nicht austesten, also sind eventuell kleine Fehler drinn... Aber korrigiert mich gerne, wenn euch was auffällt.

Woher ich das weiß:Hobby
ohwehohach  30.06.2020, 10:03

Das macht aber was anderes als das, was gefordert ist.

1
lateinfreak1234  30.06.2020, 10:04
@ohwehohach

Ups, stimmt, es guckt welche Personen überdurchschnittlich viele Payback Punkte haben... Hab dann wohl die Frage nicht ganz genau gelesen xD

1
SELECT Kunde.Name FROM Kunde WHERE Kunde.PaybackPunkte > (SELECT Kunde.PaybackPunkte FROM Kunde WHERE Kunde.Name = "Maximilian Durchschnittsbürger")

Ein Graus die Tabelle. Verstößt bereits gegen die 1. NF.

Da es eine Kundentabelle ist, dürfte das Einmal auftauchen eigentlich gar kein Faktor sein...

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting