Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL-Abfrage mit mehreren Bedingungen

Dieses Thema im Forum "Microsoft Access" wurde erstellt von weingummi_99, 27 Januar 2017.

  1. weingummi_99

    weingummi_99 Benutzer

    Hallo,
    vielleicht kann mit hier jemand helfen.
    ich muss eine Tabelle nach der Anzahl, bzw. Proz.Anteil Abfragen. Die Ausgangstabelle hier sehr vereinfacht dargestellt:
    Vnr Geschlecht Kind
    7893 M J
    9948 W N
    3847 W N
    3492 M N
    9458 M J
    1236 M J
    2459 W J
    3489 W N

    Jetzt soll abgefragt werden wieviel M, W und Kinder es gibt. Allerdings zählt ein Kind vollwertig und ist somit nicht mehr M oder W. Ich hoffe es wird verständlicher, wenn ich zeige wie das Ergebnis aussehen soll:
    Geschlecht Anzahl
    M 1
    W 3
    Kind 4

    Bis jetzt benutze ich 2 seperate Abfragen mit jeweils M oder W:
    SELECT Geschlecht as maennlich, Count(Geschlecht) AS Anzahl
    FROM Tabellenname
    WHERE (Geschlecht) Like "M" GROUP BY Geschlecht
    UNION SELECT KIND_Kennz as Geschlecht_, Count(KIND_Kennz) AS Anzahl
    FROM Tabellenname
    WHERE (Geschlecht) Like "M" AND (KIND_Kennz) Like "J" GROUP BY KIND_Kennz;

    Danach mach ich geschwind in Excel weiter zieh die Kinder jweils von M und M ab und mach dann eine Gesamttabelle wie oben. Dazu dann noch den Prozentualen Anteil.

    Geht das aber nicht in einer Abfrage?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from weingummi ;
     geschlecht | kind
    ------------+------
     m  | t
     w  | f
     w  | f
     m  | f
     m  | t
     m  | t
     w  | t
     w  | f
    (8 Zeilen)
    
    test=*# select count(1) filter (where geschlecht = 'm' and not kind) as maennlich, count(1) filter (where geschlecht='w' and not kind) as weiblich, count(1) filter (where kind) as kind from weingummi ;
     maennlich | weiblich | kind
    -----------+----------+------
      1 |  3 |  4
    (1 Zeile)
    
    Geht das auch durch? Mit PostgreSQL, falls filter (...) nicht verfügbar mt case when ersetzen.
     
  3. weingummi_99

    weingummi_99 Benutzer

    Huch, ich bin da leider noch etwas hemdsärmelig unterwegs und kann wie man oben sieht auch nur gaaaanz einfache Abfragen. Für mich ist die Antwort leider zu speziell ;)
    Ich kenn wie gesagt auch nur die einfachen Abfragen in Access mit select/from/where.
    Was bedeutet denn hier test? oder das *(ich kenne das als Platzhalter?)
    Wär super wenn du es mir ganz einfach erklären könntest
    ansonsten muss ich halt mit meinen 2 abfragen und dem späteren Excel-gewurstel leben ;)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das "test=*#" ist nur der Prompt der Datenbank. In etwa mit dem "C:\" oder so, wenn Du eine Dos-Box aufmachst ;-)

    Was willst noch wissen?

    Grüße aus Fulda.
     
  5. weingummi_99

    weingummi_99 Benutzer

    Hi,
    filter geht anscheinend nicht, habs dann mit case when probiert. meine Abfrage sieht jetzt so aus:

    SELECT count(1)
    case when (WHERE Geschlecht = 'M' and not KIND_Kenz='J') as maennlich, count(1) case when (WHERE Geschlecht='W' and not KIND_Kenz='J') as weiblich, count(1) case when (WHERE KIND_Kenz='J') as kind
    FROM Tabelle;

    dann bringt mir Access einen Fehler:
    "Syntaxfehler (fehlender Operator) in Abfrageausdruck 'Count(1) case when (where Geschlecht = 'M' and not KIND_Kenz='J')."

    wenn ich mal einfach vermuten darf, dann meckert er weil keine klare Reihenfolge Select/from/where eingehalten wurde? oder aber er kann nix mit Count(1) anfangen.
    Ähm ich übrigens auch nicht. Klar weiß ich dass Count einfach nur zusammenzählt, aber in der Abfrage mit (1) konnte ich mir jetzt auch keinen reim machen.

    kannst du mir nochmal helfen?
     
  6. weingummi_99

    weingummi_99 Benutzer

    ach ich seh gerade, du machst in deiner "ersten" Abfrage diese zweispaltige Tabelle.... ich bin wirklich verwirrt wie das geht..
     
  7. weingummi_99

    weingummi_99 Benutzer

    Ich hab eine Lösung erhalten! So funtkioniert es: (allerdings sieht die Tabelle anders aus, aber das Ergebnis ist, das was ich wollte)
    SELECT COUNT(*) AS G, SUM(Abs(KIND= 'J')) AS K, SUM((KIND= 'N') * (Geschlecht = 'M')) AS M, SUM((KIND= 'N') * (Geschlecht = 'W')) AS W
    FROM Tabelle;
    union
    SELECT 'proz. Aufteilung' AS G,
    (SUM(Abs(KIND = 'J')))/(select count(VNR) From Tabelle),
    (SUM((KIND = 'N') * (Geschlecht = 'M')))/(select count(VNR) From Tabelle),
    (SUM((KIND = 'N') * (Geschlecht = 'W')))/(select count(VNR) Tabelle)
    FROM Tabelle;

    Lieber Akretschmer, vielen Dank, dass du versucht hast mir zu helfen! ;)
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

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