1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. PHP/MySQL

Wie lese ich folgenden Code?

  • Konkordanz
  • 26. August 2021 um 13:49
  • Konkordanz
    Anfänger
    Reaktionen
    1
    Beiträge
    13
    • 26. August 2021 um 13:49
    • #1

    Hallo Forum,

    ich versuche, SQL zu erlernen und habe an einem praktischen Beispiel folgenden Code zugeschickt bekommen. Mein Anliegen war folgendes:

    In meinem Datensatz habe ich verschiedene (mehrfach vorkommende) Städte und eine Spalte prices (einige kommen auch hier mehrfach vor, allerdings sind es je Stadt immer dieselben). Viele Zellen der Preis-Spalte sind jedoch leer. Mein Ziel ist: Fülle die leeren Zellen mit den stadtspezifischen Angaben der Preis-Spalte.

    Die Lösung funktioniert sehr gut, allerdings verstehe ich nicht so recht, wie man diesen Code liest. Kann mir dabei jemand helfen? Also, was in dem Code gehört zusammen? Wo fängt ein neuer Unterbefehl an usw.?

    Danke!

    Code
    data have;
    infile cards truncover;
    input city :$20. price;
    cards;
    Dresden 2005
    Berlin 
    Frankfurt 
    Bonn 
    Berlin 4030
    Bonn 
    Dresden 2005
    Frankfurt 6053
    Berlin 
    Frankfurt 
    Dresden 
    Bonn 
    Berlin 4030
    Frankfurt 
    Bonn 3050
    Dresden 
    ;
    run;
    
    
    proc sql;
        create table want as select a.*,b.price as price2 from
        have as a left join (select city,max(price) as price from have group by city) as b
        on a.city=b.city;
    quit;
    Alles anzeigen
  • cx01
    Weiß worum´s geht
    Reaktionen
    26
    Beiträge
    144
    • 26. August 2021 um 15:07
    • #2

    Also Zeile 1 bis 22 sind kein SQL, sondern SAS (wenn ich richtig gegoogelt habe). Der Code ist wohl dafür verantwortlich, eine Tabelle namens "have" anzulegen und mit Daten zu befüllen.

    Ich nehme mal an, du beziehst dich nur auf Zeile 26-28. Ich würde empfehlen, den Code einfach in einen Online-Formatter einzufügen, z.B.: https://www.dpriver.com/pp/sqlformat.htm

    Einfach den Code reinkopieren (ohne das "proc sql;" oder "quit;") und dann "Format SQL" drücken. Alles, was im Output dann großgeschrieben und blau ist, sind SQL-Befehle. Alles Kleingeschriebene sind Tabellen- oder Spaltennamen.

  • Konkordanz
    Anfänger
    Reaktionen
    1
    Beiträge
    13
    • 27. August 2021 um 09:26
    • #3

    Klasse, danke für die schnelle Antwort. Also ja, ich hätte dazu schreiben sollen, dass es mir lediglich um den SQL-Code geht (Zeile 25-29). Ich verwende in der Tat SAS. Der Anfangscode war letztlich nur dazu da, um den SQL-Code nachvollziehbarer zu machen.

    Danke auch für den Link. Allerdings zeigt mir SAS bereits an, bei welchen Abschnitten es sich um SQL-Befehle handelt und bei welchen nicht. Die einzelnen Abschnitte verstehe ich auch...auch, was left join bspw. macht. Die Verschachtelung der unterschiedlichen Befehle jedoch ist für mich noch etwas problematisch; und, was das vorgesetzte a bzw. b genau bedeutet (a.* bzw. b.[...]). Ich habe meine Interpretation der einzelnen Zeilen hinzugefügt...stimmt das soweit oder gibts hier noch Fehler bzw. Ungenauigkeiten?


    proc sql;

    create table want SAS, erstelle mir eine neue Tabelle, welche den Namen want trägt

    as select Wähle für diese neue Tabelle folgende Inhalte aus anderen Tabellen aus...

    a.*, ...#1: Alle Inhalte der Tabelle have; diese kopierst du in die temporäre Tabelle a

    b.price as price2 ...#2 Wähle aus der Tabelle have die Spalte price und packe sie in die temporäre Tabelle b.

    from have SAS zieht die Daten aus der Tabelle have.

    as a Die temporäre Tabelle a ist auf der linken Seite des left-join-Befehls. Hiervon werden also alle Inhalte involviert.

    left join

    (select city,max(price) as price from have group by city) as b Die temporäre Tabelle b steht auf der rechten Seite des left-join-Befehls, was bedeutet, dass hiervon nur ein Teil entnommen wird. Der Datensatz b wird für den Join-Einsatz noch formatiert bzw. spezifiziert: Gruppiere die Daten anhand der Spalte city, wodurch im finalen temp. Datensatz b jede Stadt nur 1x vorkommt. In die Spalte price wird für jede Stadt zudem der Maximale Wert aus der Spalte price eingetragen. Diese Spalte soll benannt als "price".

    on a.city=b.city; Gib mir nur jene Daten aus, bei denen die Spalte City der temp. Tabelle a mit der Spalte City der temp. Tabelle b übereinstimmt. In der Ausgabetabelle wird nun der gesamte Datensatz a ausgegeben, welcher im Kern dem AusgangsDatensatz want gleicht. Zusätzlich wird eine Spalte eingefügt mit dem Namen "price2". Diese bezieht jene Werte ein, welche in der temp. Tabelle b definiert wurde.

  • cx01
    Weiß worum´s geht
    Reaktionen
    26
    Beiträge
    144
    • 27. August 2021 um 11:54
    • #4

    Sollte weitestgehend stimmen bis auf zwei Dinge:

    Zitat von Konkordanz

    a.*, ...#1: Alle Inhalte der Tabelle have; diese kopierst du in die temporäre Tabelle a

    Ich würde "a" nicht als temporäre Tabelle bezeichnen. Das "AS"-Keyword erzeugt einfach nur einen Alias. Du könntest also genauso gut jedes Vorkommen von "a" durch "have" ersetzen. Der Befehl sagt also nur "Gib mir alle Felder von a".

    Zitat von Konkordanz

    b.price as price2 ...#2 Wähle aus der Tabelle have die Spalte price und packe sie in die temporäre Tabelle b.

    "b" ist hier nicht die Tabelle "have" sondern die Subquery, die den Maximalpreis sucht (Also der zweite SELECT block).


    Vielleicht hilft es auch, sich vorzustellen, in welcher Reihenfolge die Query dann tatsächlich ausgeführt wird. Das würde ungefähr so ablaufen:

    - "have AS a": Lade die gesamte Tabelle "have" und benenne sie als "a".

    - "(SELECT city, Max(price) AS price FROM have GROUP BY city) AS b": Erzeuge eine Tabelle mit zwei Spalten "city" und "price", wobei "price" den Maximalpreis enthält, und benenne sie als "b".

    - "a LEFT JOIN b ON a.city = b.city": Joine die beiden eben geladenen Tabellen.

    - "SELECT a.*, b.price as price2": Von der gejointen Tabelle alle Felder von "a" und das (in "price2" benannte) price-Feld von "b" behalten.

  • Konkordanz
    Anfänger
    Reaktionen
    1
    Beiträge
    13
    • 30. August 2021 um 11:56
    • #5

    Großartig, vielen Dank für deine Hilfe!

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™