SQL Abfrage mit Variable

voodoo-magic

Benutzer
Beiträge
6
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
 
Werbung:
zeig mal wie die Tabelle aufgebaut ist und einige Beispieldaten sowie was basierend aus diesen Daten bei rauskommen soll. Bitte Copy&Paste - fähig.
 
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
 
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)
 
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)
 
Werbung:
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)
 
Zurück
Oben