SqlServer 使用 case when 实现行转列,并创建视图表查询
其实是个很简单的操作了,但长时间不用有点忘记了,正好项目上遇到这样的需求便把过程记录了下来。
一 需求描述
将河道水情表 结构如下,现在需要将水位Z字段由行展示转换为列展示。查询结果为展示时间和每个测站最近一次上报的数据。
实现效果如下:
二.实现过程
代码其实很简单。这里不需要说明很多直接附上sql语句
SELECT TM, MAX(CASE WHEN STCD='05283556' THEN Z ELSE NULL END) AS 水位测站1, MAX(CASE WHEN STCD='15553247' THEN Z ELSE NULL END) AS 水位测站2, MAX(CASE WHEN STCD='15716184' THEN Z ELSE NULL END) AS 水位测站3, MAX(CASE WHEN STCD='21817862' THEN Z ELSE NULL END) AS 水位测站4, MAX(CASE WHEN STCD='21824818' THEN Z ELSE NULL END) AS 水位测站5, MAX(CASE WHEN STCD='25669984' THEN Z ELSE NULL END) AS 水位测站6 from [dbo].[ST_RIVER_R] where TM>=(select MAX(TM) from [dbo].[ST_RIVER_R]) group by TM
到这里行转列就可以了。
我这里还需要创建一个视图表,方便查询,再附上视图创建语句
Create View RealData AS SELECT TM, MAX(CASE WHEN STCD='05283556' THEN Z ELSE NULL END) AS 水位测站1, MAX(CASE WHEN STCD='15553247' THEN Z ELSE NULL END) AS 水位测站2, MAX(CASE WHEN STCD='15716184' THEN Z ELSE NULL END) AS 水位测站3, MAX(CASE WHEN STCD='21817862' THEN Z ELSE NULL END) AS 水位测站4, MAX(CASE WHEN STCD='21824818' THEN Z ELSE NULL END) AS 水位测站5, MAX(CASE WHEN STCD='25669984' THEN Z ELSE NULL END) AS 水位测站6 from [dbo].[ST_RIVER_R] where TM>=(select MAX(TM) from [dbo].[ST_RIVER_R]) group by TM GO
然后查询视图表 RealData 就行了。