Reputation: 8970
I have a query that I am working on that seems to be working fine so far. However I wanted to get a little more data from it but I am running into an issue.
Working:
SELECT A.[employee],
sum(A.[awardValue]) as totalAwarded,
(
SELECT B.[supEmpID]
FROM empTable as B
WHERE B.[empID] = A.[employee]
)
FROM taxTracker as A
WHERE YEAR(A.[awardDate]) = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1))
AND NOT EXISTS (SELECT employee
FROM taxTrackerTracked
WHERE [year] = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1)))
GROUP by employee
HAVING SUM(A.[awardValue]) > '75.00'
Not Working (Joining data in my sub select):
SELECT A.[employee],
sum(A.[awardValue]) as totalAwarded,
(
SELECT B.[supEmpID],
C.[Email]
FROM empTable as B
JOIN empTable as C
ON C.[empID] = B.[supEmpID]
WHERE B.[empID] = A.[employee]
)
FROM taxTracker as A
WHERE YEAR(A.[awardDate]) = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1))
AND NOT EXISTS (SELECT employee
FROM taxTrackerTracked
WHERE [year] = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1)))
GROUP by employee
HAVING SUM(A.[awardValue]) > '75.00'
Error: Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Is there an easy fix for this?
Upvotes: 0
Views: 49
Reputation: 1269623
There is an easy fix. In SQL Server the easy way is with cross apply
:
SELECT A.[employee], sum(A.[awardValue]) as totalAwarded,
bc.*
FROM taxTracker as A CROSS APPLY
(SELECT B.[supEmpID], C.[Email]
FROM empTable as B
JOIN empTable as C
ON C.[empID] = B.[supEmpID]
WHERE B.[empID] = A.[employee]
) bc
WHERE YEAR(A.[awardDate]) = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1))
AND NOT EXISTS (SELECT employee
FROM taxTrackerTracked
WHERE [year] = YEAR(GETDATE())
AND employee IN (SELECT ParamValues.x1.value('empID[1]', 'VARCHAR(50)')
FROM @awardEmployees.nodes('/employees/employee') AS ParamValues(x1)))
GROUP by employee, bc.supEmpID, bc.Email
HAVING SUM(A.[awardValue]) > '75.00';
EDIT:
I added the bc
column names to the group by
. This is a fast fix. In practice, you might want to do the aggregation first as a subquery and then cross apply those results to get the additional columns. I'm leaving the answer as above, because I wanted to make as few changes to the original query as possible.
Upvotes: 2