這對我來說很棘手......Transact SQL - 動態構建列名
我在Microsoft SQL Server 2008上工作,我有一個包含personnames的表。人名可能隨時間而改變,因此也有歷史信息。
例子:
PID Sequence Name
1 0 Michael Hansen
2 0 Ulla Hansen
2 94 Ulla Margrethe Hansen
2 95 Ulla Margrethe Jensen
3 0 Daniella Oldfield
3 95 Daniella Quist
(我還沒有建立這個表格 - 所以我不能進去,如何改變數據存儲)。 PID 1的人稱爲Michael Hansen。這是他現在的名字(序列0總是指定當前的名字),並且沒有其他記錄他總是被命名爲邁克爾漢森。
個人PID 2目前稱爲Ulla Hansen(序列0)。在此之前,她被稱爲Ulla Margrethe Hansen(因爲這是下一個序列號),在此之前她又被稱爲Ulla Margrethe Jensen。
我對此表的瞭解是,當前名稱始終是序列0.我也知道,如果有兩個名稱,則下一個序列是95.並且三個歷史名稱:當前名稱:序列0,在該序列之前94和最古老的名字95.
而我的數據庫包含最多6個歷史名稱(序列0,91,92,93,94,95)的信息。
現在,我已經告訴每個人只有一行像列出一個新表中的所有名稱:
PID Name1 Name2 Name3
1 Michael Hansen
2 Ulla Hansen Ulla Margrethe Hansen Ulla Margrethe Jensen
3 Daniella Oldfield Daniella Quist
到目前爲止,我有以下SQL幾乎工程:
SELECT PID
,MAX(CASE sequence WHEN 0 THEN Name ELSE '' END) AS Name1
,MAX(CASE sequence WHEN 91 THEN Name ELSE '' END) AS Name2
,MAX(CASE sequence WHEN 92 THEN Name ELSE '' END) AS Name3
,MAX(CASE sequence WHEN 93 THEN Name ELSE '' END) AS Name4
,MAX(CASE sequence WHEN 94 THEN Name ELSE '' END) AS Name5
,MAX(CASE sequence WHEN 95 THEN Name ELSE '' END) AS Name6
FROM tblShipTypeHistory
GROUP BY PID
它給我所有的名字,因爲我希望每個PID都有一行。並且當前名稱也始終列在Name1下。問題是我需要第二個最新的名字在Name2列等等。我的情況它(當然)只適用於一個人有六個名字。
因此,我需要做的是根據PID實際擁有的名稱動態地將Name2列名爲Name6。所以我試圖動態構建我的SQL,像(DECLARE @SQL AS NVARCHAR(MAX),然後將@SQL =設置爲上面的SQL示例)。然後我試圖像
SET @SQL = 'SELECT ....
,MAX(CASE sequence WHEN 91 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 4 + '
,MAX(CASE sequence WHEN 92 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 3 + '
,MAX(CASE sequence WHEN 93 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 2 + '
,MAX(CASE sequence WHEN 94 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 1 + '
,MAX(CASE sequence WHEN 95 THEN Name ELSE '' END) AS Name' + COUNT(PID) + '
邏輯上這可能是工作(這將給予正確的列名),但不幸的是語法「+數(PID)」不起作用。
(Phew!)那麼任何有此解決方案的人?
預先感謝您。
好吧,它適合我!我知道最多隻有6個歷史名稱,實際上它是按照我的意願命名的,所以從這裏大拇指!謝謝! – olf 2012-08-10 10:41:58
非常感謝,你的sql代碼也解決了我的問題。 @Jonas Lincoln – 2013-07-24 03:51:02