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

SQL Abfrage mit Variable

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von voodoo-magic, 13 November 2019.

  1. voodoo-magic

    voodoo-magic Benutzer

    Hallo zusammen,

    ich habe eine SQL Abfrage mit einer Variablen erstellt.

    Code:
    #SET @var1 = '2018-01-12';
    SELECT Klausurdatum INTO @var1 FROM notenverwaltung.klausuruebersicht;
    SELECT
       Klausurtyp,
       round(sum(Punkte)/count(*),2) as Punkteschnitt1,
       round(sum(Punkte)/count(*),2) - round(sum(Punkte)/count(*)/10,3) as Gleitklausel,
       ceiling(round(sum(Punkte)/count(*),2) - round(sum(Punkte)/count(*)/10,3)) as Gleitklausel,
        (SELECT count(*) FROM notenverwaltung where Klausurdatum = @var1) as Teilnehmer,
        count(*) mitgeschrieben,
        (SELECT count(*) Attest FROM notenverwaltung where Klausurdatum = @var1 and Note <= '4') as bestanden,
        (SELECT count(*) Attest FROM notenverwaltung where Klausurdatum = @var1 and Note = '5') as nicht_bestanden,
        (SELECT count(*) Attest FROM notenverwaltung where Klausurdatum = @var1 and Attest = 'T') as Attest,
        (SELECT count(*) Fehlversuch FROM notenverwaltung where Klausurdatum = @var1 and Fehlversuch = 'T') as Fehlversuch   
    FROM
       notenverwaltung
    where
       Klausurdatum = @var1 and Punkte is not null
    
    Es kommt diese Fehlermeldung:
    --
    Error occurred during SQL script execution

    Ursache:
    SQL-Fehler [1172] [42000]: Result consisted of more than one row
    --

    mit Überspringen/Ignorieren wird mir nur der erste Wert der Tabelle (notenverwaltung.klausuruebersicht) ausgegeben.

    upload_2019-11-13_10-43-24.png

    Inhalt Tabelle (notenverwaltung.klausuruebersicht):

    2017-07-03
    2018-01-12
    2018-01-23
    2018-07-03
    2018-07-10
    2018-07-11
    2019-01-11
    2019-01-21
    2019-07-04
    2019-07-16

    Wie muss ich die Abfrage Umbauen damit alle Werte aufgelistet werden?

    Ist das so überhaupt möglich?

    Danke Gruß vm
     
  2. akretschmer

    akretschmer Datenbank-Guru

    zeig mal wie die Tabelle aufgebaut ist und einige Beispieldaten sowie was basierend aus diesen Daten bei rauskommen soll. Bitte Copy&Paste - fähig.
     
  3. voodoo-magic

    voodoo-magic Benutzer

    Danke für die schnelle Antwort.

    Tabelle mit den Ergebnissen:
    id_test;Matrikelnummer;Fach;Klausurtyp;Klausurdatum;Punkte;Note;Attest;Fehlversuch
    1;100001;test1;Klausur;2017-07-03;14;3;F;F
    2;100002;test1;Klausur;2017-07-03;18;1;F;F
    3;100003;test1;Klausur;2017-07-03;12;4;F;F
    4;100004;test1;Klausur;2017-07-03;18;1;F;F
    5;100005;test1;Klausur;2017-07-03;19;1;F;F
    6;100006;test1;Klausur;2017-07-03;16;2;F;F
    7;100007;test1;Klausur;2017-07-03;17;2;F;F
    8;100008;test1;Klausur;2017-07-03;17;2;F;F
    9;100009;test1;Klausur;2017-07-03;19;1;F;F
    10;100010;test1;Klausur;2017-07-03;20;1;F;F
    186;100011;test2;Klausur;2018-01-12;17;2;F;F
    187;100012;test2;Klausur;2018-01-12;19;1;F;F
    188;100013;test2;Klausur;2018-01-12;15;3;F;F
    189;100014;test2;Klausur;2018-01-12;14;3;F;F
    190;100015;test2;Klausur;2018-01-12;17;2;F;F
    191;100016;test2;Klausur;2018-01-12;15;3;F;F
    192;100017;test2;Klausur;2018-01-12;17;2;F;F
    193;100018;test2;Klausur;2018-01-12;14;3;F;F
    194;100019;test2;Klausur;2018-01-12;17;2;F;F
    195;100020;test2;Klausur;2018-01-12;16;2;F;F
    196;100021;test2;Klausur;2018-01-12;17;2;F;F
    197;100022;test2;Klausur;2018-01-12;18;1;F;F
    198;100023;test2;Klausur;2018-01-12;;;T;F
    301;100024;test3;Klausur;2018-07-03;17;2;F;F
    302;100025;test3;Klausur;2018-07-03;16;2;F;F
    303;100026;test3;Klausur;2018-07-03;17;2;F;F
    304;100027;test3;Klausur;2018-07-03;16;2;F;F
    305;100028;test3;Klausur;2018-07-03;15;3;F;F
    306;100029;test3;Klausur;2018-07-03;15;3;F;F
    307;100030;test3;Klausur;2018-07-03;16;2;F;F
    308;100031;test3;Klausur;2018-07-03;13;4;F;F
    309;100032;test3;Klausur;2018-07-03;13;4;F;F
    310;100033;test3;Klausur;2018-07-03;14;3;F;F


    hier die View (notenverwaltung.klausuruebersicht)
    --
    select
    Klausurtyp, Klausurdatum, count(0)anzahl
    from
    notenverwaltung.kpk
    group by
    Klausurdatum
    --
    Klausurtyp;Klausurdatum;anzahl
    Klausur;2017-07-03;10
    Klausur;2018-01-12;13
    Klausur;2018-07-03;11

    Aus der View wir nur das Klausurdatum als Variable genommen.

    Folgende Auflistung soll rauskommen:
    Klausurtyp;Punkteschnitt1;Gleitklausel;Gleitklausel;Teilnehmer;mitgeschrieben;bestanden;nicht_bestanden;Attest;Fehlversuch
    test1;17;15,3;16;10;10;10;0;0;0
    test2;15,08;13,572;14;13;12;0;0;1;0
    test3;15,2;13,68;14;10;10;10;0;0;0
     
  4. akretschmer

    akretschmer Datenbank-Guru

    hrm. Etwas wirr, Klausurtyp ist immer 'Klausur', in deiner Wunschtabelle aber dann der Wert aus fach. Was Gleitklausel ist bzw. wie berechnet ist mir grad nicht klar. Deine Durchschnittswerte passen auch ned ganz.

    Code:
    test=*# select * from voodo ;
     id_test | matrikelnummer | fach  | klausurtyp | klausurdatum | punkte | note | attest | fehlversuch
    ---------+----------------+-------+------------+--------------+--------+------+--------+-------------
           1 |         100001 | test1 | Klausur    | 2017-07-03   |     14 |    3 | f      | f
           2 |         100002 | test1 | Klausur    | 2017-07-03   |     18 |    1 | f      | f
           3 |         100003 | test1 | Klausur    | 2017-07-03   |     12 |    4 | f      | f
           4 |         100004 | test1 | Klausur    | 2017-07-03   |     18 |    1 | f      | f
           5 |         100005 | test1 | Klausur    | 2017-07-03   |     19 |    1 | f      | f
           6 |         100006 | test1 | Klausur    | 2017-07-03   |     16 |    2 | f      | f
           7 |         100007 | test1 | Klausur    | 2017-07-03   |     17 |    2 | f      | f
           8 |         100008 | test1 | Klausur    | 2017-07-03   |     17 |    2 | f      | f
           9 |         100009 | test1 | Klausur    | 2017-07-03   |     19 |    1 | f      | f
          10 |         100010 | test1 | Klausur    | 2017-07-03   |     20 |    1 | f      | f
         186 |         100011 | test2 | Klausur    | 2018-01-12   |     17 |    2 | f      | f
         187 |         100012 | test2 | Klausur    | 2018-01-12   |     19 |    1 | f      | f
         188 |         100013 | test2 | Klausur    | 2018-01-12   |     15 |    3 | f      | f
         189 |         100014 | test2 | Klausur    | 2018-01-12   |     14 |    3 | f      | f
         190 |         100015 | test2 | Klausur    | 2018-01-12   |     17 |    2 | f      | f
         191 |         100016 | test2 | Klausur    | 2018-01-12   |     15 |    3 | f      | f
         192 |         100017 | test2 | Klausur    | 2018-01-12   |     17 |    2 | f      | f
         193 |         100018 | test2 | Klausur    | 2018-01-12   |     14 |    3 | f      | f
         194 |         100019 | test2 | Klausur    | 2018-01-12   |     17 |    2 | f      | f
         195 |         100020 | test2 | Klausur    | 2018-01-12   |     16 |    2 | f      | f
         196 |         100021 | test2 | Klausur    | 2018-01-12   |     17 |    2 | f      | f
         197 |         100022 | test2 | Klausur    | 2018-01-12   |     18 |    1 | f      | f
         198 |         100023 | test2 | Klausur    | 2018-01-12   |        |      | t      | f
         301 |         100024 | test3 | Klausur    | 2018-07-03   |     17 |    2 | f      | f
         302 |         100025 | test3 | Klausur    | 2018-07-03   |     16 |    2 | f      | f
         303 |         100026 | test3 | Klausur    | 2018-07-03   |     17 |    2 | f      | f
         304 |         100027 | test3 | Klausur    | 2018-07-03   |     16 |    2 | f      | f
         305 |         100028 | test3 | Klausur    | 2018-07-03   |     15 |    3 | f      | f
         306 |         100029 | test3 | Klausur    | 2018-07-03   |     15 |    3 | f      | f
         307 |         100030 | test3 | Klausur    | 2018-07-03   |     16 |    2 | f      | f
         308 |         100031 | test3 | Klausur    | 2018-07-03   |     13 |    4 | f      | f
         309 |         100032 | test3 | Klausur    | 2018-07-03   |     13 |    4 | f      | f
         310 |         100033 | test3 | Klausur    | 2018-07-03   |     14 |    3 | f      | f
    (33 rows)
    test=*# select distinct (note) from voodo ;
     note
    ------
         
        3
        4
        2
        1
    (5 rows)
    test=*# select fach, avg(punkte), count(1), count(1) filter (where note <=4) as bestand, count(1) filter (where note = 5) as durchgefallen from voodo group by fach order by fach;
     fach  |         avg         | count | bestand | durchgefallen
    -------+---------------------+-------+---------+---------------
     test1 | 17.0000000000000000 |    10 |      10 |             0
     test2 | 16.3333333333333333 |    13 |      12 |             0
     test3 | 15.2000000000000000 |    10 |      10 |             0
    (3 rows)
    
    test=*# select fach, avg(punkte), count(1), count(1) filter (where note <=4) as bestand, count(1) filter (where note = 5) as durchgefallen from voodo where not attest group by fach order by fach;
     fach  |         avg         | count | bestand | durchgefallen
    -------+---------------------+-------+---------+---------------
     test1 | 17.0000000000000000 |    10 |      10 |             0
     test2 | 16.3333333333333333 |    12 |      12 |             0
     test3 | 15.2000000000000000 |    10 |      10 |             0
    (3 rows)
     
  5. voodoo-magic

    voodoo-magic Benutzer

    Vielen Dank, damit kann ich erst einmal Arbeiten.
    Mit diesem Teil count(1) filter (where Note <=4) as bestand kommt diese Fehlermeldung:

    Code:
    SQL-Fehler [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(WHERE Note<=4) as bestanden
    FROM notenverwaltung at line 1
    
    Code:
    mysql> SELECT version();
    +-----------+
    | version() |
    +-----------+
    | 8.0.18    |
    +-----------+
    1 row in set (0,00 sec)
    
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Oh, daran wird es wohl liegen verwende schon die Version 12 ;-)

    Code:
    test=*# select version();
                                                                  version                                                             
    -----------------------------------------------------------------------------------------------------------------------------------
     PostgreSQL 12.0 (Ubuntu 12.0-2.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit
    (1 row)
    
    Aber Du kannst das umschreiben zu sum(case when ... then 1 else 0 end)
     
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