1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

SQL Abfrage PLZ-Leitgebiete zählen

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von stahlprinzessin, 12. Februar 2018.

  1. stahlprinzessin

    stahlprinzessin Grünschnabel

    Hallo,

    ich habe eine LibreOffice Datenbank und muss für eine Statistik im Postversand alle Postleitzahlen und Leitgebiete herausfinden, die öfter als 20 Mal vorhanden sind.
    Das ist ansich kein Problem und ich habe es mit COUNT gelöst

    Code (SQL):
    1.  SELECT "Alle Daten"."PLZ", COUNT( "PLZ" ) FROM "Alle Daten" "Alle Daten" WHERE ( "Alle Daten"."Status" = 'aktiv' AND "Alle Daten"."nicht beschicken" IS NULL AND "Alle Daten"."Land" IS NULL ) GROUP BY "PLZ" HAVING COUNT( * ) > 19
    Allerdings gibt es (außerhalb von Wien) Leitgebiete, dh. zb die PLZ 4060 und 4074 sind ein Leitgebiet - also alles was mit 40 (60, 50 etc) beginnt, ist ein Leitgebiet.
    Wie kann ich die Abfrage so gestalten, dass für Wien (PLZ 1010-1230) gezählt wird, wenn die ganze PLZ gleich ist, für alle anderen PLZ-Bereiche, wenn nur die ersten beiden Stellen der (vierstelligen) PLZ gleich sind?
    Ist das möglich?
    Ist verständlich, was ich mein?

    Liebe Grüße,
    jopa
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Hab noch nie mit BASE gearbeitet. Aber etwa so sollte es gehen (... muss noch ersetzt werden)
    Code (SQL):
    1. SELECT
    2.     CASE
    3.         WHEN LEFT(plz, 1) = 1
    4.         THEN plz
    5.         ELSE CONCATE(LEFT(plz, 2) , '00')
    6.     END AS leitgebiet,
    7.     COUNT(*) AS cnt
    8. FROM  ...
    9. WHERE ...
    10. GROUP BY
    11.     CASE
    12.         WHEN LEFT(plz, 1) = 1
    13.         THEN plz
    14.         ELSE LEFT(plz, 2)
    15.     END
     
  3. stahlprinzessin

    stahlprinzessin Grünschnabel

    Hallo, Yaslwa,
    danke, dass du dich meier Frage annimmst!

    Erst kam ein Syntaxfehler, habe es nun angepasst:

    Code (SQL):
    1. SELECT
    2.     CASE
    3.         WHEN LEFT("PLZ", 1) = 1
    4.         THEN "PLZ"
    5.         ELSE CONCAT(LEFT("PLZ", 2) , 'xx')
    6.     END AS Leitgebiet,
    7.     COUNT(*) AS Anzahl
    8. FROM "Alle Daten" "Alle Daten"
    9. WHERE ( "Alle Daten"."Status" = 'aktiv' AND "Alle Daten"."nicht beschicken" IS NULL AND "Alle Daten"."Land" IS NULL )
    10. GROUP BY
    11. "PLZ" HAVING COUNT( * ) > 19
    Allerdings stimmt das Ergebnis nicht ganz - zb bei dem Leitgebiet 80xx werden 23 gezählt - habe es überprüft - 23 sind nur jene mit 8010 - es gibt aber noch 8020, 8042 etc, damit wären es mehr - woran kann das liegen, was kann ich noch versuchen?

    Liebe Grüße,
    jopa
     
  4. Yaslaw

    Yaslaw n/a Moderator

    Schau dir dein GROUP BY an und Meiner.
    Du gruppierst nach den ganzen PLZ. Ich nach der Leitgebietregel.
     
  5. stahlprinzessin

    stahlprinzessin Grünschnabel

    Hm - wenn ich deinen Code nehme, bekomme ich folgenden Fehler:

    SQL-Status: HY000
    Fehler-Code: 1000

    syntax error, unexpected $end, expecting BETWEEN or IN or SQL_TOKEN_LIKE
     
  6. Yaslaw

    Yaslaw n/a Moderator

    Lässt Base kein CASE in dem GROUP BY zu? Schwach. Sehr schwach.
    Dann erstelle zuerst eine ungruppierte Abfrage/View, falls man das in Base kann. Nachher gruppierst du die Resultate der VIew
     
  7. stahlprinzessin

    stahlprinzessin Grünschnabel

    OK - es scheint an Base (bzw an mir....) zu liegen - der Fehler wird nur rückgemeldet, wenn ich auf Abfrage durchführen klicke, muss zuerst auf SQL-Kommando direkt ausführen gehen - sorry!
    Jetzt hat es funktioniert, danke!!

    Jetzt muss ich nur noch schauen, wie ich das havin count >19 reinkrieg, aber zur not sortier ich es dann im Abfrageergebnis, dann sehe ich es ja auch....
     
  8. stahlprinzessin

    stahlprinzessin Grünschnabel

    Hab es schon - am Ende natürlich, hatte mich nur verschrieben....

    Danke für deine Hilfe und schönen Tag noch!!

    Liebe Grüße,
    jopa
     
Die Seite wird geladen...