I have a task
table which contains some DateTime
type columns like completed, pending, exception. It joins user
table and I want to bring
userName, AllTaskCount, AllPendingTaskCount, AllCompletedTaskCount, AllExceptionTaskCount
.
If Completed
columns has value than it will be considered as completed task, while if completed
column is null with value in exception
column then it is ExceptionTask and if neither Completed
column has value nor exception
one than it is pending task.
So I want to apply multiple count conditionally on above given condition. Please help…
Advertisement
Answer
You can use CTEs
to get the result.
x
WITH Result AS(
SELECT *, COUNT(1) OVER (ORDER BY Id) AS AllTasksCount
FROM User U
JOIN TASK T ON U.Id = T.UserId
),PendingTasks AS (
SELECT [NAme], COUNT(1) AS AllPendingTaskCount FROM Result
WHERE Completed IS NULL and Exception IS NULL
GROUP BY [Name]
),CompletedTasks AS (
SELECT [NAme], COUNT(1) AS AllCompletedTaskCount FROM Result
WHERE Completed IS NOT NULL and Exception IS NULL
GROUP BY [Name]
),ExceptionTasks AS (
SELECT [NAme], COUNT(1) AS AllExecptionTaskCount FROM Result
WHERE Completed IS NULL and Exception IS NOT NULL
GROUP BY [Name]
)
SELECT DISTINCT R.[Name]
,AllTasksCount
,AllPendingTaskCount
,AllCompletedTaskCount
,AllExecptionTaskCount
FROM Result R
JOIN PendingTasks PT
ON PT.[Name] = R.[Name]
JOIN CompletedTasks CT
ON CT.[Name] = R.[Name]
JOIN ExceptionTasks ET
ON ET.[Name] = R.[Name]
Added sample schema and data. Please update it as per your requirements. SQLFiddle