SQL视图行转列实现:合并同维度数据展示水、能源余额
解决方案:合并同组数据为单行展示多维度BAL值
嘿,这个需求很容易实现,用SQL的条件聚合或者透视函数就能搞定,下面给你两种通用的方案,适配不同数据库环境:
方案一:条件聚合(兼容绝大多数数据库)
这种方法用CASE WHEN配合聚合函数(比如MAX或SUM),把不同INQDETAIL对应的BAL值转成单独的列,再通过GROUP BY合并相同分组的行。
SELECT ID, INQCLASS, Period, MAX(CASE WHEN INQDETAIL = 'water' THEN BAL END) AS Water_BAL, MAX(CASE WHEN INQDETAIL = 'Energy' THEN BAL END) AS Energy_BAL FROM 你的视图名称 GROUP BY ID, INQCLASS, Period;
说明:
GROUP BY ID, INQCLASS, Period:把这三个字段值完全相同的行归为一组CASE WHEN:判断每行的INQDETAIL,匹配到对应类型就取出BAL值,否则返回NULLMAX():因为每组里对应每个INQDETAIL只有一个有效BAL值,用MAX可以过滤掉NULL,保留有效数值(用SUM也能达到同样效果)
执行这个查询后,你会得到这样的结果:
1233 | GROSS | 12-3-2017 | 233.32 | 122.00
方案二:使用PIVOT透视函数(适用于支持该语法的数据库,如SQL Server、Oracle)
如果你的数据库支持PIVOT语法,可以更简洁地实现行转列:
SELECT ID, INQCLASS, Period, water AS Water_BAL, Energy AS Energy_BAL FROM 你的视图名称 PIVOT ( MAX(BAL) FOR INQDETAIL IN (water, Energy) ) AS PivotTable;
说明:
PIVOT子句里指定聚合函数MAX(BAL),然后通过FOR INQDETAIL IN (water, Energy)把INQDETAIL的这两个值转成列名- 最后给透视后的结果起别名
PivotTable,再选择需要的列即可
两种方案都能满足你的需求,你可以根据自己使用的数据库类型选择合适的方法~
内容的提问来源于stack exchange,提问作者user9273223
相关产品推荐
相关产品推荐

