Wie löst man die folgende SQL Abfrage?

 - (Computer, Schule, Internet)

4 Antworten

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ß:Beruf – Softwareentwickler & ehem. IT-Specialist System Integration

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

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

1
@ohwehohach

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

1

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

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...

2
@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

Was möchtest Du wissen?