SQL需求:根据指定条件跨行列取值计算Test列
解决方案:跨行列取值实现Test列的比例计算
根据你遇到的跨行列取除数的问题,分几种常用工具的实现方案:
Excel 环境
- 直接用查找函数获取目标Reg_Nr对应的Grade作为除数,无需额外新增列:
假设Reg_Nr在A列,Grade在C列,在Test列(比如D列)的单元格输入公式:
要是你用的是Excel 365或更高版本,=IF(A2=1585, C2/VLOOKUP(1645, $A:$C, 3, FALSE), IF(A2=1588, C2/VLOOKUP(1648, $A:$C, 3, FALSE), ""))XLOOKUP会更简洁直观:
下拉公式就能批量计算所有行的Test值。=IF(A2=1585, C2/XLOOKUP(1645, $A:$A, $C:$C), IF(A2=1588, C2/XLOOKUP(1648, $A:$A, $C:$C), ""))
Power BI(DAX计算列)
- 新建计算列,通过筛选获取指定Reg_Nr的Grade值:
这里用Test = SWITCH( TRUE(), '你的表名'[Reg_Nr] = 1585, '你的表名'[Grade] / CALCULATE(MAX('你的表名'[Grade]), FILTER('你的表名', '你的表名'[Reg_Nr] = 1645)), '你的表名'[Reg_Nr] = 1588, '你的表名'[Grade] / CALCULATE(MAX('你的表名'[Grade]), FILTER('你的表名', '你的表名'[Reg_Nr] = 1648)), BLANK() )MAX是因为每个Reg_Nr对应唯一行,取最大/最小值结果一致,确保能精准拿到目标除数。
SQL 查询场景
- 两种实现方式,按需选择:
方法1:自连接获取除数
方法2:子查询直接取除数SELECT t1.Reg_Nr, t1.Class, t1.Grade, CASE WHEN t1.Reg_Nr = 1585 THEN t1.Grade / t2.Grade WHEN t1.Reg_Nr = 1588 THEN t1.Grade / t3.Grade ELSE NULL END AS Test FROM 你的表名 t1 LEFT JOIN 你的表名 t2 ON t2.Reg_Nr = 1645 LEFT JOIN 你的表名 t3 ON t3.Reg_Nr = 1648;SELECT Reg_Nr, Class, Grade, CASE WHEN Reg_Nr = 1585 THEN Grade / (SELECT Grade FROM 你的表名 WHERE Reg_Nr = 1645) WHEN Reg_Nr = 1588 THEN Grade / (SELECT Grade FROM 你的表名 WHERE Reg_Nr = 1648) ELSE NULL END AS Test FROM 你的表名;
内容的提问来源于stack exchange,提问作者UPup
相关产品推荐
相关产品推荐

