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