SQL查询:已按RateType='FMLY'过滤,如何添加SNGL费率列?
实现单表行转列:将不同RateType的Rate转为多列
你可以通过条件聚合或者PIVOT语法来实现需求,两种方法都能把不同RateType的费率转为同一行的不同列,不需要单独查询两次。
方法一:条件聚合(兼容性更强)
这种方法适用于所有支持SQL的数据库,通过CASE WHEN配合聚合函数提取对应类型的费率:
SELECT State, MAX(CASE WHEN RateType = 'FMLY' THEN Rate END) AS FamilyRate, MAX(CASE WHEN RateType = 'SNGL' THEN Rate END) AS SingleRate FROM UwrOTRNBaseRates WHERE RateType IN ('FMLY', 'SNGL') -- 仅保留需要的费率类型,提升查询效率 GROUP BY State
说明:
WHERE RateType IN ('FMLY', 'SNGL')过滤掉不需要的数据,减少计算量CASE WHEN会根据RateType匹配对应的Rate值,不匹配的返回NULLMAX()聚合函数确保每个State只返回一行,自动忽略NULL值,得到对应类型的费率
方法二:使用PIVOT语法(语法更简洁)
如果你的数据库支持PIVOT(比如SQL Server、Oracle等),可以用这种更直观的方式:
SELECT State, [FMLY] AS FamilyRate, [SNGL] AS SingleRate FROM UwrOTRNBaseRates WHERE RateType IN ('FMLY', 'SNGL') PIVOT ( MAX(Rate) -- 聚合函数,这里因为每个State+RateType唯一,MAX/SUM都可以 FOR RateType IN ([FMLY], [SNGL]) -- 指定要转成列的RateType值 ) AS PivotTable
说明:
- PIVOT会自动将
RateType的指定值转为列名 - 最后通过别名把默认列名
[FMLY]、[SNGL]改成你需要的FamilyRate和SingleRate
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

