这是我目前的情况:
我看到了一长串数据,包含名称和值,以及相应的值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
注意:我发现很难找到这个问题的标题。
答案 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
编辑:具体例子......
-- 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)