Reputation: 998
I have two queries which calculate the % for current year and previous year in a table. I need to create a single query instead of two different queries (* to save execution time).
My query look like this:
DECLARE @temptable TABLE (Id INT,FaceId INT,TimeStamp DATETIME)
INSERT INTO @temptable (Id,FaceId,TimeStamp) VALUES
(1,1,'2021-08-31 18:29:27.103'),(2,1,'2021-05-28 18:29:27.103'),(3,2,'2020-08-31 18:29:27.103'),(4,1,'2020-03-15 18:29:27.103')
--Query for current year
SELECT CAST((100 *(2*(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END)) + AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END))) /
(2 *(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END) +AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END) + AVG(CASE WHEN h.FaceId=3 THEN 1.0 ELSE 0 END))) AS DECIMAL(5,2))
FROM @temptable h
WHERE YEAR(h.TimeStamp) = YEAR(GETDATE())
--Query for previous year
SELECT CAST((100 *(2*(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END)) + AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END))) /
(2 *(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END) +AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END) + AVG(CASE WHEN h.FaceId=3 THEN 1.0 ELSE 0 END))) AS DECIMAL(5,2))
FROM @temptable h
WHERE YEAR(h.TimeStamp) = YEAR(GETDATE())-1
Is there any way to combine both in a single query?
Upvotes: 0
Views: 72
Reputation: 95554
Use a GROUP BY
clause:
--Query for current year
SELECT YEAR(h.TimeStamp) AS [Year],
CAST((100 * (2 * (AVG(CASE WHEN h.FaceId = 1 THEN 1.0 ELSE 0 END)) + AVG(CASE WHEN h.FaceId = 2 THEN 1.0 ELSE 0 END))) / (2 * (AVG(CASE WHEN h.FaceId = 1 THEN 1.0 ELSE 0 END) + AVG(CASE WHEN h.FaceId = 2 THEN 1.0 ELSE 0 END) + AVG(CASE WHEN h.FaceId = 3 THEN 1.0 ELSE 0 END))) AS decimal(5, 2))
FROM @temptable h
WHERE h.TimeStamp >= DATEFROMPARTS(YEAR(GETDATE())-1,1,1)
AND h.TimeStamp < DATEFROMPARTS(YEAR(GETDATE())+1,1,1)
GROUP BY YEAR(h.TimeStamp);
I also make your WHERE
SARGable, by converting it to date boundaries.
Upvotes: 2