2016-05-29 4 views
-2

Ich möchte einen ShowRoomId Wert an die Abfrage unten übergeben. Die Employees Tabelle hat eine ShowRoomId Spalte.Hinzufügen einer WHERE-Klausel in einer komplexen SQL-Abfrage

Wie kann ich es tun?

My SQL-Abfrage ist, wie folgend:

SELECT * 
FROM Employees A 
OUTER APPLY (SELECT TOP 1 * 
      FROM EmployeeBasics B 
      WHERE (A.EmployeeID = B.EmployeeID) 
      ORDER BY B.BasicUpdateDate DESC) AS B 
OUTER APPLY (
      SELECT C.EmployeeId , count(*) AS TotalAbsent 
      FROM EmployeeAbsents C 
      WHERE C.AbsentDate BETWEEN '2016-05-01' AND '2016-05-30' AND A.EmployeeID = C.EmployeeID 
      GROUP BY C.EmployeeId 
      ) AS C 
OUTER APPLY (
      SELECT EmployeeId, 
       SUM(CASE WHEN TransctionTypeId = 1 THEN Amount ELSE 0 END) AS Payment, 
       SUM(CASE WHEN TransctionTypeId = 2 THEN Amount ELSE 0 END) AS RecoverSalary, 
       SUM(CASE WHEN TransctionTypeId = 3 THEN Amount ELSE 0 END) AS RecoverCash 
      FROM dbo.EmployeeAdvances D 
      WHERE A.EmployeeID = D.EmployeeID 
      GROUP BY EmployeeId 
      ) AS D 
+0

Warum schreiben Sie jedes Wort mit Großbuchstaben? Können Sie versuchen, eine Wo-Klausel an das Ende Ihrer komplexen Abfrage hinzuzufügen? Es sollte funktionieren. –

+0

Ja, es ist Arbeit. Vielen Dank Lieber Giorgi Nakeuri. –

+0

BTW: Sie verwenden "OUTER APPLY" Art von unangemessen. Die erste "OUTER APPLY" ist in Ordnung; per EmployeeID erhalten Sie das neueste EmployeeBasic. Aber die anderen beiden Gruppen von EmployeeID, die überflüssig ist, weil Sie äußere durch eine EmployeeID anwenden. Entfernen Sie einfach die GROUP BY-Klauseln und die EmployeeId aus den SELECT-Klauseln. Oder ändern Sie "OUTER APPLY" in "LEFT JOIN" und verschieben Sie den EmployeeID-Vergleich in die ON-Klausel. –

Antwort

0

einfach eine WHERE Klausel am Ende wie folgt verwendet werden:

... YOUR SELECT ... 
WHERE Col = ...YourCondition... 

ODER

Verwenden WITH Stichwort Ihre aktuellen Stand zu halten SELECT -Anweisung in einer cte. Dann mach deine Anfrage darauf.

WITH cte AS 
(
    ... YOUR SELECT ... 
) 

SELECT * 
FROM cte 
WHERE Col = ...YourCondition... 

ODER

Sie können Ihre SELECT -Anweisung in Klammern an und nennen Sie es mit einem allias Namen hinzuzufügen. Sie können also auch eine Abfrage durchführen.

SELECT * 
FROM 
(
    ... YOUR SELECT ... 
) t 

WHERE t.Col = ...YourCondition... 
0

Per Giorgi Nakeuri Rat, habe ich die WHERE-Klausel am Ende der Anweisung.

Und es funktioniert für mich. Überarbeiteter Code ist hier:

SELECT * 
FROM Employees A 
OUTER APPLY (SELECT TOP 1 * 
      FROM EmployeeBasics B 
      WHERE (A.EmployeeID = B.EmployeeID) 
      ORDER BY B.BasicUpdateDate DESC) AS B 
OUTER APPLY (
      SELECT C.EmployeeId , count(*) AS TotalAbsent 
      FROM EmployeeAbsents C 
      WHERE C.AbsentDate BETWEEN '2016-05-01' AND '2016-05-30' AND A.EmployeeID = C.EmployeeID 
      GROUP BY C.EmployeeId 
      ) AS C 
OUTER APPLY (
      SELECT EmployeeId, 
       SUM(CASE WHEN TransctionTypeId = 1 THEN Amount ELSE 0 END) AS Payment, 
       SUM(CASE WHEN TransctionTypeId = 2 THEN Amount ELSE 0 END) AS RecoverSalary, 
       SUM(CASE WHEN TransctionTypeId = 3 THEN Amount ELSE 0 END) AS RecoverCash 
      FROM dbo.EmployeeAdvances D 
      WHERE A.EmployeeID = D.EmployeeID 
      GROUP BY EmployeeId 
      ) AS D 
WHERE A.ShowRoomId = 2