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

MSSQL: Abfrageproblem (Verständnis)

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von MysterioJN, 27 März 2017.

  1. MysterioJN

    MysterioJN Datenbank-Guru

    Tach zusammen,

    folgende Tabelle:
    ID , Projektname , Projektbeginn , Abgeschlossen (BIT)
    1 , A , 2016 , 1
    2 , B , 2016 , 0
    1 , C , 2017 , 1
    1 , D , 2017 , 1
    1 , E , 2017 , 0


    Ergebnis soll sein:

    Jahr , Abgeschlossen , Offen
    2016 , 1 , 1
    2017 , 2 , 1


    Wenn ich folgenden SELECT verwende, Gruppiert er zwar nach Jahr, aber in jeder Datenzeile stehen die selben Werte (Klar, da im Subselect kein Jahresgruppierung -> Was ich aber wegen Rückgabe mehrerer Werte aus Subselect nicht darf):

    Code:
    SELECT
    
    ProjektBeginn AS Jahr,
    COUNT(ID) FROM Projekte WHERE Abgeschlossen = 1 ) AS 'Abgeschlossen',
    COUNT(ID) FROM Projekte WHERE Abgeschlossen = 0 ) AS 'Offen',
    
    FROM Projekte
    
    GROUP BY ProjektBeginn
    Ich brauch das Ergebnis für ein stapelbares Diagramm.

    Kann mir jemand eine Alternative mitteilen? Stehe voll auf dem Schlauch.
    Danke schon einmal fürs Lesen!!

    Beste Grüße
    Marco
     
  2. MysterioJN

    MysterioJN Datenbank-Guru

    Oh entschuldige, hab einen falschen Select hier eingestellt:

    Nochmal:

    Code:
    SELECT
    
    ProjektBeginn AS Jahr,
    (SELECT COUNT(ID) FROM Projekte WHERE Abgeschlossen = 1 )) AS 'Abgeschlossen',
    (SELECT COUNT(ID) FROM Projekte WHERE Abgeschlossen = 0 )) AS 'Offen',
    
    FROM Projekte
    
    GROUP BY ProjektBeginn
     
  3. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT
    
    ProjektBeginn AS Jahr,
    sum(CASE WHEN abgeschlossen = 1 THEN 1 ELSE 0 END) AS 'Abgeschlossen',
    sum(CASE WHEN abgeschlossen = 1 THEN 0 ELSE 1 END) AS 'Offen'
    
    FROM Projekte
    
    GROUP BY ProjektBeginn
     
  4. MysterioJN

    MysterioJN Datenbank-Guru

    Autsch. So einfach und einfach einfach. Warum bin ich depp.... naja mir steckt die Grippe noch in den Knochen. Ganz lieben Dank!! Tolle Lösung. Du bist wie immer der Beste!
     
  5. MysterioJN

    MysterioJN Datenbank-Guru

    Muss dich leider noch ein Mal nerven:

    Folgende Situation: Ein Projekt hat mehrere Aufgaben

    Tabelle Auflagen sieht z.B. wie folgt aus:

    ID , ProjektID , Abgeschlossen (bit)
    1 , 10 , 1
    2 , 10 , 0
    3 , 10 , 0
    4 , 20 , 1


    Ich schaffe es nicht in einem Statement zu sagen:

    - wenn ALLE Aufgabe des EINES Projektes bei "Abgeschlossen" = 1 dann "&#10004"
    - wenn NICHT ALLE Aufgaben des EINES Projektes bei "Abgeschlossen" = 1 dann SUM(Abgeschlossen = 0)
    - wenn es bisher gar keine Aufgabe (Datensatz) gab, dann " "



    Streng genommen gibt es noch eine weitere Bedingung, und zwar hat JEDE Aufgabe einen STATUS (Planung = 1 , Durchführung = 2 , Abnahme = 3 , Dokumentation = 4)

    Lass dich nicht verwirren, aber das ist mal meine nur zu 80 % richtig funktionierender Code (Problem ist die erste CASE Bedingung, die läuft nicht sauber)

    Code:
    SELECT
    
    
    CASE WHEN (Select COUNT(Aufgaben.ID) FROM Aufgaben WHERE Aufgaben.Abgeschlossen = '1' AND Aufgaben.Status_ID = '2' AND Aufgaben.Projekte_ID = Projekte.ID) <>  (Select COUNT(Aufgaben.ID) FROM Aufgaben WHERE Aufgaben.Abgeschlossen = '0' AND Aufgaben.Status_ID = '2' AND Aufgaben.Projekte_ID = Projekte.ID)
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    ELSE
    (CASE WHEN
    (Select COUNT(Aufgaben.ID) FROM Aufgaben WHERE Aufgaben.Abgeschlossen = '0' AND Aufgaben.Status_ID = '2' AND Aufgaben.Projekte_ID = Projekte.ID) = 0
    
    THEN ''
    
    ELSE (Select COUNT(Aufgaben.ID) FROM Aufgaben WHERE Aufgaben.Abgeschlossen = '0' AND Aufgaben.Status_ID = '2' AND Aufgaben.Projekte_ID = Projekte.ID) END) END AS DURCHFÜHRUNG,
    
    
    FROM Projekte

    Aber fürs leichtere Verständnis wäre ich schon Mal mit dem oben genannten zufrieden.

    Dank dir!!
     
    Zuletzt bearbeitet: 28 März 2017
  6. MysterioJN

    MysterioJN Datenbank-Guru

    EDIT: Halt stopp. Hab es hinbekommen. Musste die CASE WHEN mit OR erweitern und natürlich einer ordentlichen Portion LOGIK ^^

    OK danke dir aber dennoch.

    Beste Grüße
     
  7. ukulele

    ukulele Datenbank-Guru

    Du machst es dir sehr kompliziert. Zum einen kannst du mit CASE mehrere Fälle in einem CASE abhandeln und musst CASE nicht schachteln. Dann machst du hier sehr viele Subselects auf die selben Inhalte mit count(*). Das bremst nicht nur deine Datenbank sondern ist auch sehr unübersichtlich, da darf man ruhig mal was verschachteln.
    Code:
    SELECT   t.ID,
         (   CASE
           WHEN   t.abgeschlossen <> t.nicht_abgeschlossen
           THEN   '<font color ="green"> <b> &#10004 </font></b>'
           WHEN   t.nicht_abgeschlossen = 0
           THEN   ''
           ELSE   cast(t.nicht_abgeschlossen AS VARCHAR(10))
           END ) AS DURCHFUEHRUNG
    FROM   (
    
    SELECT   p.ID,
         sum(CASE WHEN a.Abgeschlossen = '1' THEN 1 ELSE 0 END) AS abgeschlossen,
         sum(CASE WHEN a.Abgeschlossen = '0' THEN 1 ELSE 0 END) AS nicht_abgeschlossen
    FROM   Projekte p
    LEFT JOIN Aufgaben a
    ON     p.ID = a..Projekte_ID
    WHERE   a.Status_ID = '2'
    GROUP BY p.ID
    
         ) t
     
  8. MysterioJN

    MysterioJN Datenbank-Guru

    Dank dir. Naja das war auch leider wieder nur ein Auszug aus dem SELECT. Hier mal der ganze Select als Beispiel. Und wie ich den mit all den Kriterien umbauen soll in dein Schema ist mir nach 2 Stunden rumprobieren nicht gelungen.

    Von daher gebe ich nun auf und lasse Ihn so wie er ist, da er funktioniert. Beste Grüße!

    Code:
    SELECT DISTINCT
    
    Kanban.dbo.Projekte.Projektname AS Projekt,
    
    
    CASE WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '1' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) >  (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX)
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) < 0
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = 0
    THEN ''
    ELSE CONCAT((Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX),CASE WHEN (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = NULL THEN '' ELSE
    ' (' +  (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) + ')' FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '1' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) END) END AS PLANUNG,
    
    
    CASE WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '1' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) >  (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX)
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) < 0
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = 0
    THEN ''
    ELSE CONCAT((Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX),CASE WHEN (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = NULL THEN '' ELSE
    ' (' +  (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) + ')' FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '2' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) END) END AS DURCHFÜHRUNG,
    
    
    
    CASE WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '1' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) >  (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX)
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) < 0
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = 0
    THEN ''
    ELSE CONCAT((Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX),CASE WHEN (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = NULL THEN '' ELSE
    ' (' +  (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) + ')' FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '3' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) END) END AS ABNAHME,
    
    
    CASE WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '1' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) >  (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX)
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) < 0
    THEN '<font color ="green"> <b> &#10004 </font></b>'
    WHEN (Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = 0
    THEN ''
    ELSE CONCAT((Select COUNT(Kanban.dbo.Aufgaben.PIDX) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX),CASE WHEN (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) = NULL THEN '' ELSE
    ' (' +  (SELECT MAX(FORMAT(Kanban.dbo.Aufgaben.DatumEnde,'dd.MM.yyyy')) + ')' FROM Kanban.dbo.Aufgaben WHERE Kanban.dbo.Aufgaben.Abgeschlossen = '0' AND Kanban.dbo.Aufgaben.Phasen_PIDX = '4' AND Kanban.dbo.Aufgaben.Projekte_PIDX = Kanban.dbo.Projekte.PIDX) END) END AS DOKUMENTATION,
    
    
    CASE WHEN Kanban.dbo.Projekte.Abgeschlossen = 1 THEN Null ELSE
    Datediff(dd,Convert(date,getdate()),Kanban.dbo.Projekte.Projektende) END AS Resttage
    
    
    FROM Kanban.dbo.Projekte
    
    
    WHERE Kanban.dbo.Projekte.Abgeschlossen = 0
    AND Projektname <> '- Sammelbehälter'
    
    
    
    ORDER BY
    CASE WHEN Kanban.dbo.Projekte.Abgeschlossen = 1 THEN Null ELSE
    Datediff(dd,Convert(date,getdate()),Kanban.dbo.Projekte.Projektende) END
     
    Zuletzt bearbeitet: 29 März 2017
  9. ukulele

    ukulele Datenbank-Guru

    Solange du nicht irgendwann mit viel mehr Daten konfrontiert wirst...
     
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