mysql pivot_mysql 的行转列 PIVOT 的使用

本文介绍了如何在MySQL中使用PIVOT函数进行行转列的操作,通过具体的SQL语句展示如何将数据从行转换为列,包括基础查询、带有条件的查询以及存储过程的实现,以实现动态数据的统计分析。

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

语句:SELECT DataDate ,

PropertyText ,

DataValue

FROM RPT_ReportProperty p WITH ( NOLOCK ) JOIN RPT_ReportData d WITH ( NOLOCK ) ON p.PropertyID = d.PropertyID

WHERE d.ReportID = '3'

AND DataDate >= '06 25 2018 12:00AM'

AND DataDate < '07 16 2018 12:00AM'

AND DataParam = '日本'

结果:

e31afb62dde05b177472c32ac82641e0.png

语句:

SELECT [月份],[日期],[入库单量],[入库及时率],[延误入库单量],[异常入库单量]

FROM ( SELECT DataDate ,

PropertyText ,

DataValue

FROM RPT_ReportProperty p WITH ( NOLOCK ) JOIN RPT_ReportData d WITH ( NOLOCK ) ON p.PropertyID = d.PropertyID

WHERE d.ReportID = '3'

AND DataDate >= '06 25 2018 12:00AM'

AND DataDate < '07 16 2018 12:00AM'

AND DataParam = '日本'

) tb PIVOT ( MAX(DataValue) FOR PropertyText IN ( [月份],[日期],[入库单量],[入库及时率],[延误入库单量],[异常入库单量] ) ) a;

结果:

6661b7deeef34c496d5c9b0ad4243ec3.png

3.执行的语句

DECLARE @limitDay INT;

SET @limitDay = 35;

IF DATEDIFF(DAY, '2018-06-25 00:00:00', '2018-07-16 00:00:00') > @limitDay

BEGIN

RETURN;

END;

DECLARE @ReportID INT= 3;

DECLARE @BeginDateTime DATETIME= '2018-06-25 00:00:00';

DECLARE @EndDateTime DATETIME= '2018-07-16 00:00:00';

DECLARE @DataParam VARCHAR(50)= '日本';

EXEC dbo.Proc_GetReportData @ReportID, @BeginDateTime, @EndDateTime,

@DataParam;

存储过程:Proc_GetReportData

USE [Tr.TWX]

GO

/****** Object: StoredProcedure [dbo].[Proc_GetReportData] Script Date: 2018/7/16 15:08:06 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER PROCEDURE [dbo].[Proc_GetReportData]

@ReportID VARCHAR(5) ,

@BeginDateTime VARCHAR(25) ,

@EndDateTime VARCHAR(25),

@DataParam VARCHAR(50)=NULL

AS

BEGIN

DECLARE @sql VARCHAR(5000)

SELECT @sql = ISNULL(@sql + ',', '') + '[' + PropertyText + ']'

FROM RPT_ReportProperty WITH ( NOLOCK )

WHERE ReportID = @ReportID

AND StatusFlag = 1

IF @DataParam IS NULL OR @DataParam=''

BEGIN

SET @sql = 'select ' + @sql

+ ' from(SELECT DataDate,PropertyText,DataValue FROM RPT_ReportProperty p WITH(NOLOCK) JOIN RPT_ReportData d WITH(NOLOCK) ON p.PropertyID=d.PropertyID WHERE d.ReportID='''

+ @ReportID + ''' AND DataDate>= ''' + @BeginDateTime

+ ''' AND DataDate< ''' + @EndDateTime

+ ''')tb pivot (max(DataValue) for PropertyText in (' + @sql

+ '))a'

END

ELSE

BEGIN

SET @sql = 'select ' + @sql

+ ' from(SELECT DataDate,PropertyText,DataValue FROM RPT_ReportProperty p WITH(NOLOCK) JOIN RPT_ReportData d WITH(NOLOCK) ON p.PropertyID=d.PropertyID WHERE d.ReportID='''

+ @ReportID + ''' AND DataDate>= ''' + @BeginDateTime

+ ''' AND DataDate< ''' + @EndDateTime

+ ''' AND DataParam= ''' + @DataParam

+ ''')tb pivot (max(DataValue) for PropertyText in (' + @sql

+ '))a'

END

EXEC(@sql)

END

GO

-------------------------------------------附加信息:-----------------------------------

SELECT * FROM RPT_Report --需要查询的数据

SELECT * FROM RPT_ReportScheduler ORDER BY CreateTime DESC --添加临时执行任务 循环表RPT_Report数据加到RPT_ReportScheduler

SELECT * FROM RPT_ReportProperty p WHERE PropertyText IN ( '月份','日期','入库单量','入库及时率','延误入库单量','异常入库单量' ) AND p.ReportID=3 --事先已经加入到统计查询语句

SELECT TOP 50 * FROM RPT_ReportData WHERE ReportID=3 ORDER BY CreateTime DESC --执行后的数据放在此表

688bfa4595ccded970f0e1b8b9a6a200.png

在调度下面的:BusinessReportAnalysisScheduler

相关的表在百度云:TWX/定时统计报表的统计数据(各表).xls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值