2016-04-20 10 views
-5

Bitte helfen Sie mir, wie dieses ProblemMsg 116, Ebene 16, Status 1

fixiert

Msg 116, Ebene 16, Status 1, Prozedur openclosebycat, Zeile 18
nur ein Ausdruck in der Auswahl angegeben werden können Liste, wenn die Unterabfrage nicht mit EXISTS eingeführt wird.

Msg 116, Ebene 16, Status 1, Prozedur openclosebycat, Zeile 20
In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeführt wird.

Mein Code:

select distinct 
    (SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS LIKE 'closed') 
     AND (OPEN_TIME >= @DateFrom) 
     AND (CLOSE_TIME <= @DateTo)) AS closen, 
    (SELECT NUMBER, STATUS, ID 
    FROM dbo.PROBS 
    WHERE (STATUS LIKE 'closed') 
     AND (OPEN_TIME >= @DateFrom) 
     AND (CLOSE_TIME <= @DateTo)) AS closedet, 
    (SELECT NUMBER, STATUS, ID 
    FROM dbo.PROBS 
    WHERE (STATUS LIKE 'open') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS opendet, 
    (SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'problem') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closeporb, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'request for information') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closereinfo, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'incident') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closeincid, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'closed') 
    AND (CATEGORY = 'complaint') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS closecomp, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'open') 
    AND (CATEGORY = 'problem') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS openporb, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'open') 
    AND (CATEGORY = 'request for information') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS openreinfo, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'open') 
    AND (CATEGORY = 'incident') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS openincid, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS = 'open') 
    AND (CATEGORY = 'complaint') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS opencomp, 
(SELECT COUNT(*) 
    FROM dbo.PROBS 
    WHERE (STATUS LIKE 'open') 
    AND (OPEN_TIME >= @DateFrom) 
    AND (CLOSE_TIME <= @DateTo)) AS openn 
FROM 
    dbo.PROBS 
+0

Sieht aus wie Sie Prozedur haben 'openclosebycat', die nicht vollständig auf eine Frage eingefügt wird und Problem steht in Zusammenhang mit dem 'EXISTS' Schlüsselwort, das ebenfalls fehlt. – Fka

+0

Sie müssen den gesamten Code unbedingt durch die entsprechende CASE-Anweisung ersetzen. Es gibt keinen Grund, all diese Unterabfragen in der Select-Anweisung auszuführen. Das besondere Problem hier ist, dass jede Ihrer Subselects nur ein Ergebnis zurückgeben kann, einige geben 3 zurück (NUMBER, STATUS, ID). –

Antwort

2

Eine Unterabfrage in der SELECT nur ein Attribut auswählen können. Ich bin mir nicht sicher, was Sie versuchen zu tun, aber Sie werden wie zu etwas neu zu schreiben haben:

SELECT NUMBER 
,  STATUS 
,  ID 
,  SUM(CASE 
        WHEN STATUS like 'closed' and OPEN_TIME >= @DateFrom and CLOSE_TIME <= @DateTo 
        THEN 1 
        ELSE 0 
      END) as closen 
,  {same for the other counts} 
FROM  dbo.PROBS 
GROUP BY NUMBER 
,  STATUS 
,  ID 
Verwandte Themen