首页 > 解决方案 > 合并当年和上一年的结果

问题描述

我有两个查询计算表中当前年份和上一年的百分比。我需要创建一个查询而不是两个不同的查询(* 以节省执行时间)。

我的查询如下所示:

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

有没有办法将两者结合在一个查询中?

标签: sqlsql-server

解决方案


使用GROUP BY子句:

--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);

我还WHERE通过将其转换为日期边界来使您的 SARGable。


推荐阅读