SQL Server中Pivot()函數實現動態行轉列


一般情況下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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM