Abfragehilfe

Frieder

Neuer Benutzer
Beiträge
3
Hallo allerseits!
Ich bin ganz neu bei SQL, habe aber meine Abfragen soweit hinbekommen, dass die erwarteten Antworten kommen.

An einer (vermutlich) Kleinigkeit scheitere ich grade, weil ich keine Idee habe wie ich es lösen könnte.

Ich habe folgende Tabellen

Inventar
ID, posten,Typ,fertig
1,11,a,1
2,56,a,1
3,56,b,0
4,56,c,0
5,56,d,0

Typen
Typid,Bearbeitungsort
a, raum1
b,raum1
c, raum1
d, raum2

Ich kann Abfragen, welche inventare in einem bestimmten Raum noch nicht fertig sind.
Select* from Inventar, Typen where Inventar.typ = Typen.Typ and Inventar.fertig =0 and Typen.Bearbeitungsort = raum1

Jetzt hätte ich gerne eine zusätzliche Spalte, in der der Fortschritt des Postens steht... Sowas wie bei posten 56 sind in raum1 2 von insgesamt 4 inventaren nicht fertig.


Groß und Kleinschreibungund Leerzeichen kommen von der Handy Tastatur...

Wäre toll wenn ihr mir helfen könnt!
Frieder
 
Werbung:
so in etwa?

Code:
edb=*# select * from inventar ;
 id | posten | typ | fertig
----+--------+-----+--------
  1 |     11 | a   | t
  2 |     56 | a   | t
  3 |     56 | b   | f
  4 |     56 | c   | f
  5 |     56 | d   | f
(5 rows)

edb=*# select * from typen ;
 typid |  ort  
-------+-------
 a     | raum1
 b     | raum1
 c     | raum1
 d     | raum2
(4 rows)

edb=*# select posten, typ, fertig, ort, count(fertig) over (partition by posten) as schritte, sum(case when fertig then 1 else 0 end) over (partition by posten) as fertig, sum(case when not fertig then 1 else 0 end) over (partition by posten) as unfertig from inventar inner join typen on Inventar.typ = Typen.Typid;
 posten | typ | fertig |  ort  | schritte | fertig | unfertig
--------+-----+--------+-------+----------+--------+----------
     11 | a   | t      | raum1 |        1 |      1 |        0
     56 | a   | t      | raum1 |        4 |      1 |        3
     56 | b   | f      | raum1 |        4 |      1 |        3
     56 | c   | f      | raum1 |        4 |      1 |        3
     56 | d   | f      | raum2 |        4 |      1 |        3
(5 rows)

edb=*
 
und wenn Du das noch nach Raum haben willst und einen schönen Text dazu:

Code:
edb=*# with tmp as (select posten, typ, fertig, ort, count(fertig) over (partition by posten,ort) as schritte, sum(case when fertig then 1 else 0 end) over (partition by posten,ort) as erledigt, sum(case when not fertig then 1 else 0 end) over (partition by posten,ort) as unfertig from inventar inner join typen on Inventar.typ = Typen.Typid) select *, erledigt::text || ' von gesamt ' || schritte::text || ' im Raum ' || ort || ' sind fertig' as status from tmp;
 posten | typ | fertig |  ort  | schritte | erledigt | unfertig |                  status                 
--------+-----+--------+-------+----------+----------+----------+------------------------------------------
     11 | a   | t      | raum1 |        1 |        1 |        0 | 1 von gesamt 1 im Raum raum1 sind fertig
     56 | a   | t      | raum1 |        3 |        1 |        2 | 1 von gesamt 3 im Raum raum1 sind fertig
     56 | b   | f      | raum1 |        3 |        1 |        2 | 1 von gesamt 3 im Raum raum1 sind fertig
     56 | c   | f      | raum1 |        3 |        1 |        2 | 1 von gesamt 3 im Raum raum1 sind fertig
     56 | d   | f      | raum2 |        1 |        0 |        1 | 0 von gesamt 1 im Raum raum2 sind fertig
(5 rows)

Prost!
 
Das sieht genau richtig aus!!

vielleicht noch folgende Hinweise:

  • verwende expliziete Joins. In Deinem ersten Post war das ein implizieter Join. Dabei steht dann die join-condition mit im Where-Teil. Schlecht lesbar und fehleranfällig
  • in produktivem Code kein select * verwenden
  • wenn Du sauberes und schönes SQL lernen willst, mit einer wirklich guten Datenbank, dann verabschiede Dich von MySQL
 
Danke für die Hinweise!
Das * war auch nur hier im Beispiel, und leider habe ich keine Wahl und muss MySQL verwenden (Datenbank läuft auf der Arbeit).

Und am schlimmsten, es läuft die Version 5.7.33! Und da gabs noch kein "over". Kann ich das ganze anders formulieren, so dass es auf der veralteten Version läuft?
Grüße
 
Werbung:
Zurück
Oben