sql - 合并当年和上一年的结果
问题描述
我有两个查询计算表中当前年份和上一年的百分比。我需要创建一个查询而不是两个不同的查询(* 以节省执行时间)。
我的查询如下所示:
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
有没有办法将两者结合在一个查询中?
解决方案
使用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。
推荐阅读
- javascript - Knockout.js 在表中添加和更新数组
- javascript - WebView SpeedTest 结果总是低于 CustomTab 或 Chrome
- c# - LINQ to NHibernate join - 查询每组的最新 N - NotSupportedException
- node.js - Asyncronous module function is not working
- javascript - 异步 try/catch 中的多个等待。如何使一个条件?
- firebase - Firebase 查询和规则
- excel - 提取引号之间的文本并移动到下一个单元格/行 vba
- javascript - jquery每个函数和拖放jquery ui
- azure - Azure AD B2C 将用户流与应用一对一关联
- r - 删除向量中前 10 个字符之后的所有字符 (R)