SQL Server中Pivot()函数实现动态行转列
2017-08-25 16:07
351 查看
一般情况下Pivot()函数中in中只能写死,因为PIVOT()的in中不支持子查询,所以这样的话只能用存储过程来解决;
CREATE PROCEDURE InsurancePivot
@Foldercode VARCHAR(50),
@isY VARCHAR(4)
AS
BEGIN DECLARE @ColumnNames VARCHAR(3000)
SET @ColumnNames=''
SELECT @ColumnNames = @ColumnNames + '[' + TESTNO + '],'
FROM ( SELECT TESTNO FROM ORDTASK
LEFT JOIN TESTS ON TESTS.TESTCODE = ORDTASK.TESTCODE
WHERE ORDTASK.FOLDERNO IN (SELECT FOLDERNO FROM FOLDERS WHERE FOLDERCODE = @Foldercode) ) t
SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)
DECLARE @selectSQL NVARCHAR(3000)
SET @selectSQL= 'SELECT P.* FROM ( select foldercode as "受理单编号",ordcode as "样品编号",orders.ORIGINALNO as "原始编号", orders.name as "姓名", pa.SEX as "性别", pa.AGE as "年龄", pa.ADDRESS as "现住址", folders.DATERECV as "收样日期",FINAL,name.TESTCODE, orders.SAMPLINGDATE, TESTNO
from orders left join folders on orders.folderno = folders.folderno
left join PATIENTS pa on pa.PID = orders.PID
left join (select ordno, results.FINAL,tests.testno ,tests.testcode
from analytes
left join ORDTASK on ordtask.TESTCODE = analytes.TESTCODE and ordtask.METHOD = analytes.METHOD
left join results on results.ANALYTE = analytes.ANALYTE and results.ORDTASKNO = ordtask.ORDTASKNO
left join tests on tests.testcode = analytes.TESTCODE
where analytes.displayflag = '''+@isY+''') name on name.ordno = orders.ordno where foldercode = '''+@Foldercode+''' ) a
pivot( max(FINAL) for TESTNO in ({0}))p'
SET @selectSQL= REPLACE(@selectSQL,'{0}',@ColumnNames)
EXEC sp_executesql @selectSQL
END
GO
CREATE PROCEDURE InsurancePivot
@Foldercode VARCHAR(50),
@isY VARCHAR(4)
AS
BEGIN DECLARE @ColumnNames VARCHAR(3000)
SET @ColumnNames=''
SELECT @ColumnNames = @ColumnNames + '[' + TESTNO + '],'
FROM ( SELECT TESTNO FROM ORDTASK
LEFT JOIN TESTS ON TESTS.TESTCODE = ORDTASK.TESTCODE
WHERE ORDTASK.FOLDERNO IN (SELECT FOLDERNO FROM FOLDERS WHERE FOLDERCODE = @Foldercode) ) t
SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)
DECLARE @selectSQL NVARCHAR(3000)
SET @selectSQL= 'SELECT P.* FROM ( select foldercode as "受理单编号",ordcode as "样品编号",orders.ORIGINALNO as "原始编号", orders.name as "姓名", pa.SEX as "性别", pa.AGE as "年龄", pa.ADDRESS as "现住址", folders.DATERECV as "收样日期",FINAL,name.TESTCODE, orders.SAMPLINGDATE, TESTNO
from orders left join folders on orders.folderno = folders.folderno
left join PATIENTS pa on pa.PID = orders.PID
left join (select ordno, results.FINAL,tests.testno ,tests.testcode
from analytes
left join ORDTASK on ordtask.TESTCODE = analytes.TESTCODE and ordtask.METHOD = analytes.METHOD
left join results on results.ANALYTE = analytes.ANALYTE and results.ORDTASKNO = ordtask.ORDTASKNO
left join tests on tests.testcode = analytes.TESTCODE
where analytes.displayflag = '''+@isY+''') name on name.ordno = orders.ordno where foldercode = '''+@Foldercode+''' ) a
pivot( max(FINAL) for TESTNO in ({0}))p'
SET @selectSQL= REPLACE(@selectSQL,'{0}',@ColumnNames)
EXEC sp_executesql @selectSQL
END
GO
相关文章推荐
- SQL server使用pivot函数实现行转列
- PIVOT函数快速实现行转列,UNPIVOT实现列转行
- SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行
- Oracle 11g Pivot函数实现行转列
- Sql Server 2000 行转列 的实现
- 在 SQL Server 2K 中实现 大小写敏感的查询条件(WHERE ...),类似 Access(VB) 的 StrComp 函数
- [转]SQL SERVER 函数组合实现oracle的LPAD函数功能
- Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行
- SQL Server中的RAND函数的介绍和区间随机数值函数的实现
- Sql Server 2005 ROW_NUMBER 函数实现分页
- oracle 行转列 及 pivot函数使用问题
- NTILE函数在SQL Server 2000中的实现方法
- sql server 2008 使用 for xml path 实现类似 oracle 的 concat 函数
- 从SQL Server向Oracle迁移的技术实现方案(七)常用SQL语法与函数
- SQL Server 2005中开发通用的自定义函数,实现类似Min或MAX函数功能(附源码)
- 行转列:SQL SERVER PIVOT与用法解释
- 经常用到的透视函数(行转列&列转行)函数 PIVOT()&UNPIVOT
- SQL Server 排序实现函数细说