技术选型:ssm
数据库选型:SQL Server 2008 R2
问题:某大神把所有数据都定义成了字段、查询时需要将列转行后才可以计算、还要求整点的数据、超级恶心的要求、最后要求返回此类型数据。普通单纯的列转行还是不能实现的、一步一步嵌套。
列装行SQL(写的还是有些麻烦的):
SELECT
P.tg_name,
P.tg_val,
P.record_time
FROM(
SELECT
HTHG11_MX_001,
record_time
FROM
CE_BD_technics
) T UNPIVOT (
tg_val FOR tg_name IN (HTHG11_MX_001)
) P
接着添加 WHERE 条件、查询出数据:
DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等。
DATEDIFF() 函数返回两个日期之间的时间。
关于这两个函数的具体参数可以查看 W3school。
SELECT
(
CASE
WHEN p.tg_val = 'False' THEN
'0'
ELSE
p.tg_val
END
) AS tg_val,
LEFT (
CONVERT (
VARCHAR (100),
P.record_time,
120
),
13
) AS valueDate
FROM
(
SELECT
HTHG11_MX_001,
record_time
FROM
CE_BD_technics
WHERE
DATEPART(mi, record_time) = 0
AND DATEDIFF(d, record_time, '2019-03-26') = 0
) T UNPIVOT (
tg_val FOR tg_name IN (HTHG11_MX_001)
) P
接着计算我们所需要的数据进行计算、和分组:
因为我的数据中不光是 数值、还有False 此处做了 CASE WHEN 的判断、最后用 GROUP BY 拿时间分组处理一下。
CONVERT() 函数是数据类型的转换。
COUNT() 函数返回在给定的选择中被选的行数。
SELECT
m.valueDate,
CONVERT (
VARCHAR (100),
(
SUM (CONVERT(FLOAT, m.tg_val)) / COUNT (valueDate)
)
) AS pv
FROM
(
SELECT
(
CASE
WHEN p.tg_val = 'False' THEN
'0'
ELSE
p.tg_val
END
) AS tg_val,
LEFT (
CONVERT (
VARCHAR (100),
P.record_time,
120
),
13
) AS valueDate
FROM
(
SELECT
HTHG11_MX_001,
record_time
FROM
CE_BD_technics
WHERE
DATEPART(mi, record_time) = 0
AND DATEDIFF(d, record_time, '2019-03-26') = 0
) T UNPIVOT (
tg_val FOR tg_name IN (HTHG11_MX_001)
) P
) m
GROUP BY
m.valueDate
自此数据封装返回完成。