SQL Server 列转行

本文介绍在SQLServer2008R2中如何使用复杂查询将列转换为行,包括使用TUNPIVOT函数、DATEPART和DATEDIFF函数筛选整点数据,并通过CASE WHEN语句处理非数值数据,最终实现数据计算与分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术选型: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

 

自此数据封装返回完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值