MSSQL: Abfrageproblem (Verständnis)

MysterioJN

SQL-Guru
Beiträge
158
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
 
Werbung:
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
 
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
 
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!
 
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:
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
 
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
 
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:
Werbung:
Zurück
Oben