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

Hilfe bei SQL Abfrage: Signal in Ordnung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Pilli, 29 Mai 2019.

  1. Pilli

    Pilli Neuer Benutzer

    Hallo,

    ich habe eine Checkliste mit mehreren Fragestellungen zu einem Signal. Wenn alle Fragen mit JA (+) beantwortet worden, hätte ich gerne einen Datensatz mit "Signal ist in Ordnung"
    Wenn eine der Fragen mit Nein beantwortet wird, hätte ich gerne einen Datensatz mit der Info "Signal ist nicht in Ordnung".

    Ich bin leider mit meinen eigenen Ideen auf keine Lösung gekommen.

    Vielleicht hat jemand eine Idee und kann mir helfen.

    select

    act_note as Signal, ack_event as AA_Nummer, ack_act as Tätigkeitsnummer, ack_desc, ack_yes as in_Ordnung, ack_no as nicht_in_Ordnung , ack_notes as Beschreibung_Fehler

    from r5actchecklists, r5activities

    where ack_event = act_event and act_act =ack_act and ack_event = '164288'
    upload_2019-5-29_9-23-52.png
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich hab das mal vereinfacht:

    Code:
    test=# create table pilli(signal int, frage int, okay bool);
    CREATE TABLE
    test=*# insert into pilli values (1, 1, true);
    INSERT 0 1
    test=*# insert into pilli values (1, 2, true);
    INSERT 0 1
    test=*# insert into pilli values (1, 3, true);
    INSERT 0 1
    test=*# insert into pilli values (2, 1, true);
    INSERT 0 1
    test=*# insert into pilli values (2, 2, false);
    INSERT 0 1
    
    test=*# select * from pilli ;
     signal | frage | okay
    --------+-------+------
          1 |     1 | t
          1 |     2 | t
          1 |     3 | t
          2 |     1 | t
          2 |     2 | f
    (5 rows)
    
    Für signal=1 sind alle 3 Fragen TRUE, für signal=2 von 2 Fragen eine FALSE.

    Code:
    test=*# select signal, case when count(frage) = sum(case when okay then 1 else 0 end) then true else false end from pilli group by signal;
     signal | case
    --------+------
          1 | t
          2 | f
    (2 rows)
    
    test=*#
    
     
  3. ukulele

    ukulele Datenbank-Guru

    Das ist in mehreren Punkten gruselig.

    • Die Tabellen haben offensichtlich Spalten mit Tabellenpräfix, das ist eher unsinnig. Arbeite lieber mit Tabellenaliasen, siehe Beispiel.
    • Die Präfixe sind sich zudem extrem ähnlich, ich bin nicht sicher welche Spalte aus welcher Tabelle kommt.
    • Nutze bitte explizite Joins, siehe Beispiel.
    • Die Information in Ordnung / nicht in Ordnung passt in eine Binäre Spalte, du hast zwei Spalten mit einem Zeichen drin?

    Beispiel:
    Code:
    select
    
    act_note as Signal,
    ack_event as AA_Nummer,
    (CASE WHEN max(CASE WHEN ack_no = '+' THEN 1 ELSE 0 END) = 1 THEN 'nicht in Ordnung' ELSE 'in Ordnung' END) AS [i.O.]
    
    FROM   r5actchecklists chkl
    INNER JOIN r5activities act
    ON       chkl.ack_event = act.act_event
    AND       chkl.ack_act = act.act_act
    WHERE   ack_event = '164288'
    GROUP BY act_note,ack_event
    
     
    Walter und Pilli gefällt das.
  4. Pilli

    Pilli Neuer Benutzer

    Vielen Dank Ukulele - genau die Lösung die ich gesucht habe.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du solltest seine Hinweise aber dennoch beachten.
     
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