SQL Server 2014:查询指定行中总和超阈值的所有列
解决方案:获取SQL Server 2014指定行中符合条件的列
因为你无法修改现有表结构,我们可以用UNPIVOT操作将列转换为行,这样就能轻松筛选出符合条件的列。下面分两种常见场景给出实现代码:
场景1:筛选指定行中单个列值大于指定阈值的列
比如你想找出sYear=2023这一行里,所有月份列(m1-m12)中值大于100的列,可以用以下查询:
-- 定义目标年份和阈值 DECLARE @TargetYear INT = 2023; DECLARE @SingleValueThreshold DECIMAL(18,2) = 100.00; SELECT 列名 = ColumnName, 列值 = ColumnValue FROM dbo.T1 -- 将m1-m12列转换为行,每行对应一个月份列的名称和值 UNPIVOT ( ColumnValue FOR ColumnName IN (m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12) ) AS UnpivotedData WHERE sYear = @TargetYear -- 指定要查询的行 AND ColumnValue > @SingleValueThreshold; -- 筛选列值大于阈值的行
场景2:当指定行的所有月份列总和大于阈值时,返回所有月份列
如果你的需求是:当某一行的12个月数据总和超过指定值时,返回该行所有的月份列及其值,可以用CTE先计算总和,再筛选:
-- 定义目标年份和总和阈值 DECLARE @TargetYear INT = 2023; DECLARE @TotalThreshold DECIMAL(18,2) = 1200.00; WITH YearlyTotal AS ( SELECT sYear, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, 全年总和 = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10 + m11 + m12 FROM dbo.T1 WHERE sYear = @TargetYear ) SELECT 列名 = ColumnName, 列值 = ColumnValue FROM YearlyTotal UNPIVOT ( ColumnValue FOR ColumnName IN (m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12) ) AS UnpivotedData WHERE 全年总和 > @TotalThreshold;
额外说明
UNPIVOT是SQL Server中专门用于将列转换为行的操作,完美适配你不能修改原表的需求;- 你只需要根据实际需求调整
@TargetYear和阈值参数,以及WHERE条件即可; - 如果需要把列名转换成更易读的格式(比如把m1显示为"1月"),可以在SELECT里用
CASE语句转换,示例:列名 = CASE ColumnName WHEN 'm1' THEN '1月' WHEN 'm2' THEN '2月' WHEN 'm3' THEN '3月' -- 其他月份依次类推 ELSE ColumnName END
内容的提问来源于stack exchange,提问作者Marsh
相关产品推荐
相关产品推荐

