Sql 动态行转列 pivot

摘要:
最近,一位朋友提出了一个要求:以行到列的形式将产品中的书籍显示为“期刊”,还需要将工作单主表和工作单详细信息关联起来。显示内容为:工单号、操作日期、产品名称和数量。因为期刊很多,静态的可以实现,但不利于后续内容的添加。我考虑了如何以动态形式显示它们并自动拼接SQL语句,具体实现过程如下。

最近朋友有个需求:将产品中为“期刊”的书品以行转列的形式展现,同时需要关联工单主表及工单明细表,显示内容为,工单号、操作日期、产品名称及数量,由于期刊的产品数量较多,静态的虽然可以实现,但不利于后续内容的添加,就想着如何能以动态的形式展现,自动拼接sql语句处理,具体实现过程如下。

 产品信息表需用到的字段内容:

select ProductCode,Name  from ComProduct where ProductType ='20'

Sql 动态行转列 pivot第1张

工单需要用到的内容:

select JobNo,ProductCode,Quantity  from WmsJobDtl 

Sql 动态行转列 pivot第2张

 通过搜索资料,终于完成动态拼接SQL语句,具体的存储过程如下:

CREATE PROCEDURE 期刊核算汇总表

as 
begin


DECLARE @sql VARCHAR(8000)
DECLARE @COLUMN VARCHAR(8000)
 
SELECT @sql= ISNULL(@sql+',','')+ '['+ProductName+']'
    ,@COLUMN= ISNULL(@COLUMN,'')+', '+ProductName 


FROM (select wj.JobNo ,wj.StockDate, a.ProductName ,sum(wjd.Quantity) as TQty   from 
(select ProductCode,  Name as ProductName  
from ComProduct   where  ProductType ='20' ) as a 
inner  join  WmsJobDtl wjd on a.ProductCode = wjd.ProductCode
inner join WmsJob  wj on wj.JobNo = wjd.JobNo
where wj.Status = 'X'  
group by wj.JobNo ,wj.StockDate, a.ProductName) as cc 
GROUP BY ProductName           
 
SET @sql=' select  *  from
(select wj.JobNo ,wj.StockDate, a.ProductName ,sum(wjd.Quantity) as TQty   from 
(select ProductCode,  Name as ProductName  
from ComProduct   where  ProductType =''20'' ) as a 
inner  join  WmsJobDtl wjd on a.ProductCode = wjd.ProductCode
inner join WmsJob  wj on wj.JobNo = wjd.JobNo
where wj.Status = ''X''  
group by wj.JobNo ,wj.StockDate, a.ProductName
) as  dddd  pivot (max(TQty) for ProductName in ('+@sql+'))a'
 
exec   (@sql)

end

Sql 动态行转列 pivot第3张

可惜,没有解决NULL值得问题,如有能解决的朋友,欢迎留言,非常感谢。

免责声明:文章转载自《Sql 动态行转列 pivot》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML5播放器 MediaElement.js 使用方法数据结构-王道-图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL基础

一、MySQL概述 1、什么是数据库 ?答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ?答:他们均是一个软件,都有两个主要的功能: a. 将数据保存到文件或内存b. 接收特定的命令,然后对文件进行相应的操作3、什么是SQL ?答:...

一则 Oracle 和 SqlServer 语法区别 (原创)

Sql Server /Oracle--返回第一行数据SELECT TOP 1 * FROM TableName / SELECT * FROM TableName WHERE ROWNUM=1--返回前五行数据SELECT TOP 5 * FROM TableName/SELECT * FROM TableName WHERE ROWNUM <=...

SQL分组取每组前一(或几)条记录(排名)

mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a...

SQL Server(三)

一、数据库操作 create database 数据库名称 ——创建drop database 数据库名称 ——删除use 数据库名称 ——使用go 两条SQL语句之间分隔 二、表的操作 create table 表名( 列名 类型 其它,列名 id类型 其它 ) ——使用primary key ——主键identity——自增长列not null ——非...

springboot-easycode配置文件修改

网上抄的然后不能够使用,自己又改了该就可以了entity ##引入宏定义 $!define ##使用宏定义设置回调(保存位置与文件后缀) #save("/entity", ".java") ##使用宏定义设置包后缀 #setPackageSuffix("entity") ##使用全局变量实现默认包导入 $!autoImport import lo...

Oracle函数

Oracle函数 一.字符函数 (1)大小写控制函数 lower():全部小写 select LOWER('SMITH') "CLERK" from DUAL;upper():全部大写 SELECT UPPER('last_name') "Uppercase"FROM dual;initcap():首字母大写 SELECT INITCAP('the soa...