2015-06-22 105 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 –

相关问题