Microsoft SQL Server:将新列添加到行而不是重复值

时间:2015-06-22 20:52:51

标签: sql 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

注意:我发现很难找到这个问题的标题。

3 个答案:

答案 0 :(得分: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('+@columnlist+')
    ) as pvt'
EXEC(@sql)

答案 1 :(得分:2)

如果您可以确定该集合只有两个值,并且这些值始终为{1}},则可以执行以下操作:

ID

请注意,临时表仅用于说明结果。重要的是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 声明。

这会将表连接到自身以获取Value2的值。

答案 2 :(得分:2)

您需要的是PIVOT查询。根据您在数据集中的名称数量,以及您是否提前了解它们,您可能需要一个动态的Pivot"。

Pivot查询可能有点令人困惑。但这里有两个如何构建动态数据透视查询的示例。 (第二个问题是另一个Stack Overflow问题,对你的情况可能比第一个更好。)

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)