[英]Sql query for Transpose of a dynamic Table
sql表如下,
Name Salary NoticePeriod CTC
Jack 1520 15 123
Bruce 1423 35 165
它包含大約1000行。
我需要對該表進行轉置,以使預期輸出為
Fields Jack Bruce Mike ..... Sam
Salary 1520 1423 235 .. 561
NoticePeriod 15 35 23 253
CTC 123 165 45 ... 125
我嘗試在Sql Server 2008中使用Pivot和Unpivot函數。 但是由於Name記錄很大,所以Pivot查詢沒有幫助。
我的SQL嘗試如下
SELECT *
FROM (
SELECT NAME,
Salary,
NoticePeriod,
CTC
FROM CTCTABLE WITH (NOLOCK)
) AS queryTable
UNPIVOT(Value FOR NAME IN (NAME, Salary, NoticePeriod, CTC)) AS unpv
PIvot(max(Value) FOR NAME IN (Salary, NoticePeriod, CTC)) pv
對於您的情況,您應該將“ Salary, NoticePeriod, CTC
”列Salary, NoticePeriod, CTC
成行,然后將“ PIVOT
Salary, NoticePeriod, CTC
成行:
WITH Unpivoted
AS
(
SELECT Name, Fields, SalaryValue
FROM salaries AS s
UNPIVOT
(
SalaryValue
FOR Fields IN(Salary, NoticePeriod, CTC)
) AS u
)
SELECT Fields, jack,bruce
FROM Unpivoted AS u
PIVOT
(
MAX(SalaryValue)
FOR Name IN(Jack, Bruce)
) AS p;
UNPIVOT
會將Salary, NoticePeriod, CTC
列轉換為值:
然后,數據透視表將透視每個字段值的薪水值,並將名稱轉換為列。
當然,您必須動態地執行此操作,而不是像這樣編寫名稱列表:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @colnames AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct ',' +
QUOTENAME(name)
FROM salaries
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'WITH Unpivoted
AS
(
SELECT Name, Fields, SalaryValue
FROM salaries AS s
UNPIVOT
(
SalaryValue
FOR Fields IN(Salary, NoticePeriod, CTC)
) AS u
)
SELECT Fields, ' + @cols + '
FROM Unpivoted AS u
PIVOT
(
MAX(SalaryValue)
FOR Name IN(' + @cols + ')' +
') p';
execute(@query);
這將為您提供:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.