2013-05-31 61 views
0

我具有例如表的列表,B C.SQL表,加入列的值

我不知道有多少列,也不是所有的這些表的列名。

我知道每個表的關鍵名稱和我想合併的列。

一個表的典型DDL將是:

CREATE TABLE [dbo].[G_bHQ_S1](
[Key_code] [nvarchar](255) NULL, 
[array1_nbr] [int] NULL, 
[fDSHhldDetails] [int] NULL, 
[fRespName] [nvarchar](200) NULL, 
[fStoreAge] [int] NULL, 
[qSex] [int] NULL, 
[qDOB] [datetime] NULL, 
[qDOBNR] [int] NULL, 
[qAge] [int] NULL, 
[qAgeNR] [int] NULL, 
[qAgeRange] [int] NULL, 
[qAge15OrOver] [int] NULL 
) ON [PRIMARY] 

存儲前三列的數據將是類似:

Key_code   array1_nbr fDSHhldDetails  ........ 
W801053126H001 11   11     ........ 
W802078001H001 11   11     ........ 
W802078012H001 11   11     ........     
W802078012H001 12   12     ........ 
W802078022H001 11   11     ........ 
W802078022H001 12   12     ........ 
........................................................ 

每個表只能有一個,我想一列結合起來,它將始終是array1_nbr。

對於每個唯一的Key_code,我需要將array1_nbr的值與右下一列的列名稱結合使用。

因此,對於上述數據集中的結果集將是:

Key_code    fDSHhldDetails_11  fDSHhldDetails_12  ........ 
W801053126H001   11      null     ........ 
W802078001H001   11      null     ........ 
W802078012H001   11      12     ........     
W802078022H001   11      12     ........ 
.................................................................................... 

能否請你幫我這個好嗎?

謝謝。

結果爲@sgeddes設置:

Key_code    11      12    ........ 
W801053126H001   11      null    ........ 

我期待的列名fDSHhldDetails_11和fDSHhldDetails_12。並且fDSHhldDetails對於每個表都是未知的,但它是array1_nbr旁邊的列名稱。有沒有連接它的方法?否則,我可以手動添加它,查詢已經足夠我已經足夠了。感謝堆。

+1

聽起來像是你試圖轉動你的結果。是否有最大數量的列或未知數?如果未知,動態SQL可能是您唯一的選擇。 – sgeddes

+0

同意,我討厭在SQL中編寫PIVOT,因爲它的語法有點過於複雜。很多文檔和Stackoverflow上幾乎相同的問題。 – AaronLS

+0

@sgeddes列數未知.... – nzsquall

回答

2

假設您知道array1_nbr列的可能值的數量,那麼您可以將PIVOT結果。

下面是與MAX一個方式CASE

SELECT Key_Code, 
    MAX(CASE WHEN array1_nbr = 11 THEN fDSHhldDetails END) fDSHhldDetails11, 
    MAX(CASE WHEN array1_nbr = 12 THEN fDSHhldDetails END) fDSHhldDetails12 
FROM YourTable 
GROUP BY Key_Code 

這裏有一個PIVOT

SELECT Key_Code, [11] fDSHhldDetails11, [12] 
FROM 
(
    SELECT Key_Code, array1_nbr 
    FROM YourTable) p 
PIVOT 
(
    MAX(array1_nbr) 
    FOR array1_nbr IN 
    ([11], [12]) 
) pvt; 

另外,如果你不知道的列數,然後考慮使用Dynamic SQL

下面是一個例子:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(array1_nbr) 
      FROM YourTable c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @query = 'SELECT Key_code, ' + @cols + ' 
       FROM 
       (
       SELECT Key_Code, array1_nbr 
       FROM YourTable 
       ) p 
       PIVOT 
       (
       MAX(array1_nbr) 
       for array1_nbr in (' + @cols + ') 
      ) p ' 


EXECUTE(@query) 
+0

非常感謝您的回覆。對於動態SQL,查詢結果集不是我所期望的。我已經在描述中放下了結果集供您檢查。 – nzsquall