前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql行转列应用

sql行转列应用

作者头像
用户5166330
发布2019-04-16 14:58:03
1K0
发布2019-04-16 14:58:03
举报
文章被收录于专栏:帅哥哥写代码帅哥哥写代码

sql行转列应用

数据表实际存储格式

原始表 为了适应我们某个平台框架的使用(该框架直接配置sql,平台自动实现数据的返回。不写任何后端代码),同时方便前端不做任何处理。就采用sql的方式对元数据进行-行转列运用。 需求:

返回前端的数据结构 需求翻译:同一个因子,对应两个监测值,一个是value,一个是aqi。需要将同一时间,不同的监测因子以及监测因子对应的两个值,转为一行返回给前端。

解决方案

1.利用PIVOT函数(简单方便)

SELECT t1. TIME, t1.no2aqi, t1.so2aqi, t1.coaqi, t2.no2value, t2.so2value, t2.covalue FROM ( SELECT [so2] AS so2aqi, [no2] AS no2aqi, co AS coaqi, TIME FROM ( SELECT t.[name], t.[aqi], t. TIME FROM test_aqi t ) p PIVOT ( MAX ([aqi]) FOR [name] IN ([so2], [no2], co) ) AS pvt ) t1 LEFT JOIN ( SELECT [so2] AS so2value, [no2] AS no2value, co AS covalue, TIME FROM ( SELECT t.[name], t.[value], t. TIME FROM test_aqi t ) p PIVOT ( MAX ([value]) FOR [name] IN ([so2], [no2], co) ) AS pvt ) t2 ON t1.[time] = t2.[time]

PIVOT函数运行实现 简单兼完美的实现

2.利用子查询实现

SELECT t.[time], ( SELECT h.aqi FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'no2' ) AS no2aqi, ( SELECT h.aqi FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'so2' ) AS so2aqi, ( SELECT h.aqi FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'co' ) AS coaqi, ( SELECT h. VALUE FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'no2' ) AS no2value, ( SELECT h. VALUE FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'so2' ) AS so2value, ( SELECT h. VALUE FROM test_aqi h WHERE h. TIME = t.[time] AND h.name = 'co' ) AS covalue FROM test_aqi t GROUP BY t. TIME

子查询执行结果 与直接使用函数相比,代码量多了一点,也算是方便。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sql行转列应用
  • 解决方案
    • 1.利用PIVOT函数(简单方便)
      • 2.利用子查询实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档