2015-06-22 40 views
0

。下面是我目前的狀況:的Microsoft SQL Server:添加新列不是行重複值

我呈現數據的一個長長的清單,包括名稱和值,相應的值ID。對於所呈現的數據,ID的數量可以變化,但是對於整個集合而言是不變的。 (這個集合每個名稱只有2個值)。事情是,名字重複,但ID不。那麼我的問題是,

我如何轉換的表看起來像這樣:

Name | ID | Value 
Sam | 1 | 15 
Sam | 2 |  6 
Bob | 1 |  9 
Bob | 2 | 11 

進入更多的東西是這樣的:

Name | Value1 | Value2 
Sam |  15 |  6 
Bob |  9 |  11 

注:我發現一個很艱難的時期找出這個問題的標題。

回答

4

你可以使用pivot作爲例子。看看這個代碼片段:

SELECT pvt.Name, pvt.[1] as Value1, pvt.[2] as Value2 
FROM yourTable 
PIVTO (
    MAX(Value) 
    FOR id IN([1],[2]) 
) as pvt 

你只需要你額外的ID添加到IN()SELECT

如果你需要一個動態的支點,你可以用這一個在這裏:

DECLARE @sql nvarchar(max), @columnlist nvarchar(max) 

SELECT @columnlist = 
     COALESCE(@columnlist + N',['+CONVERT(nvarchar(max),cols.id)+']', 
      N'['+CONVERT(nvarchar(max),cols.id)+']' 
     ) 
FROM (SELECT DISTINCT id FROM yourTable) as cols 

-- this is your part 
SET @sql = N' 
    SELECT pvt.* 
    FROM yourTable 
    PIVTO (
     MAX(Value) 
     FOR id IN('[email protected]+') 
    ) as pvt' 
EXEC(@sql) 
2

如果你能肯定的是,集將永遠只能有兩個值,這些將永遠有一個ID是1或2,你可以這樣做以下:

CREATE TABLE #Table (Name VARCHAR(5), ID INT, Value INT) 
INSERT INTO #Table VALUES ('Sam', 1, 15), ('Sam', 2, 6), ('Bob', 1, 9), ('Bob', 2, 11) 

SELECT t.Name, 
     t.Value AS Value1, 
     t2.Value AS Value2 
    FROM #Table t 
    INNER JOIN #Table t2 ON t2.Name = t.Name AND t2.ID = 2 
    WHERE t.ID = 1 

DROP TABLE #Table 

注意的是,臨時表只是這裏說明結果。重要的是SELECT聲明。

這將表連接到自身以獲取Value2的值。

+0

您需要重寫此查詢以添加/刪除聯合操作,具體取決於您與每個名稱關聯的值的數量。我認爲這個解決方案對整個問題來說將是一個更加健全的解決方案,儘管這個解決方案對於提供的具體示例來說足夠好。 – DeadZone

+0

我同意'PIVOT'是一個更合適的解決方案,但是當只有兩個值時(如OP所指出的那樣),那麼這將更快地執行。 –

+1

實際上,OP指出:「對於呈現的數據,ID的數量可能會有所不同」,但是本例中「每個名稱只有2個值。「 – DeadZone

2

你需要的是一個PIVOT查詢。根據您的數據集中有多少個名稱,以及您是否提前知道它們,您可能需要一個「動態數據透視表」。

樞軸查詢可能有點混亂。但是,這裏有兩個如何構建動態數據透視查詢的例子。 (注:第二個是另一個堆棧溢出問題,可能是您的情況比第一次更好。)

T-SQL: Dynamic Pivot on Multiple Columns

T-SQL dynamic pivot

編輯:具體實例......

-- DROP TABLE #MyTable 
-- CREATE TABLE #MyTable(name varchar(10), ID int, value int); 

INSERT #MyTable VALUES ('Sam', 1, 15); 
INSERT #MyTable VALUES ('Sam', 2, 6); 
INSERT #MyTable VALUES ('Bob', 1, 9); 
INSERT #MyTable VALUES ('Bob', 2, 11); 
-- INSERT #MyTable VALUES ('Sam', 3, 1); 
-- INSERT #MyTable VALUES ('Bob', 3, 2); 


DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + CONVERT(varchar(5), t.ID) 
         FROM #MyTable AS t 
         --ORDER BY '],[' + t.ID 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

--SELECT @cols 

SET @query = N'SELECT name,'+ @cols +' FROM 
(SELECT t1.name, t1.ID, t1.Value FROM #MyTable AS t1) p 
PIVOT (MAX([Value]) FOR ID IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 
+0

這似乎正是我正在尋找的。我試圖使用這個代碼,每個名稱有3個和4個值,並且它工作得非常好。謝謝@DeadZone –

相關問題