sql行转列应用

sql行转列应用

数据表实际存储格式


11722485-8b70103e8f5054e1.png
原始表

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


11722485-e3720f488da39160.png
返回前端的数据结构

需求翻译:同一个因子,对应两个监测值,一个是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]
11722485-70a4314a41ee5e3d.png
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
11722485-71a021c937285218.png
子查询执行结果

与直接使用函数相比,代码量多了一点,也算是方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值