2016-05-29 11 views
-2

ShowRoomIdの値を下のクエリに渡します。 Employeesテーブルの列はShowRoomIdです。複合SQLクエリにWHERE句を追加します。

どうすればいいですか?

私のSQLクエリは、以下の通りである:

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

大文字ですべての単語を入力する理由複雑なクエリの最後にWhere句を追加できますか?それはうまくいくはずです。 –

+0

はい、それは仕事です。 Dear Giorgi Nakeuriありがとうございました。 –

+0

ところで:あなたは不適切に 'OUTER APPLY'の種類を使用しています。最初の「OUTER APPLY」は正常です。 EmployeeIDごとに、最新のEmployeeBasicを取得します。しかし、従業員IDによって他の2つのグループ、余分なので、あなたが1つのEmployeeIDによって適用するためです。単純に 'GROUP BY'節とEmployeeIdを' SELECT'節から削除してください。または、「OUTER APPLY」を「LEFT JOIN」に変更し、EmployeeIDの比較を「ON」節に移動します。 –

答えて

0

を単に次のように末尾にWHERE句を使用します。あなたの最新の状態に保つために

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

OR

使用WITHキーワード-文章はcteです。その後、あなたの質問をしてください。

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

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

OR

あなたは括弧にして、あなたのSELECT -statementを追加し、allias名で名前を付けることができます。だからあなたもそれについての質問をすることができます。ジョルジNakeuriのアドバイスを1として

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

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

、私は文の終わりにWHERE句を追加しました。

それは私のために働く。改訂コードは次のとおりです。

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 
関連する問題