我有一个充满数据的表,我希望从一行中获取内容并将其添加到列标题中,然后将相应的值放在该列的下面!我试图描述的问题最好在下表中显示:
普通表
一旦创建了这个表(这是一个临时表),我想重建表格看起来像这样
但是我已经在网上搜索了所有内容,我似乎无法在任何地方找到这样做的方法!我非常感谢你的帮助!
答案 0 :(得分:0)
试试这个
CREATE TABLE #table1
(
sourceid INT,
name VARCHAR(50),
value VARCHAR(50),
timestamp NUMERIC(10, 2)
)
INSERT INTO #table1
VALUES (1,
'Mark',
'99%',
9.00),
(1,
'Mark',
'75%',
9.30),
(1,
'Mark',
'60%',
10.00),
(1,
'Mark',
'85%',
10.30),
(2,
'John',
'50%',
9.00),
(2,
'John',
'30%',
9.30),
(2,
'John',
'65%',
10.00),
(2,
'John',
'79%',
10.30)
DECLARE @columns NVARCHAR(MAX),
@sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(timestamp)
FROM (SELECT DISTINCT p.timestamp
FROM #table1 AS p) AS x;
SET @sql = N'
select *from (SELECT *
FROM
(
SELECT * FROM #table1
) AS j
PIVOT
(
MAX(VALUE) FOR TIMESTAMP IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p)tb
order by tb.sourceid';
EXEC sp_executesql
@sql;
DROP TABLE #table1
答案 1 :(得分:0)
使用Dynamic Pivot
执行此操作。
DECLARE @sql NVARCHAR(max),
@collist VARCHAR(max)=''
SELECT @collist += Isnull(CONVERT(VARCHAR(20), Quotename(timestamp)), '')+ ','
FROM #pivo
GROUP BY timestamp
SELECT @collist = LEFT(@collist, Len(@collist) - 1)
SET @sql='select * from Tablename
pivot (max(Value) for timestamp in('
+ @collist + '))piv'
EXEC Sp_executesql @sql
答案 2 :(得分:-1)
MS SQL的动态数据透视代码
DECLARE @PivotColumnHeaders varchar(MAX)
SELECT @PivotColumnHeaders =
COALESCE(@PivotColumnHeaders + ',[' + CONVERT(varchar(5),Timestamp,108) + ']', '[' + CONVERT(varchar(5),Timestamp,108)+ ']' )
FROM (SELECT Timestamp FROM Table1 GROUP BY Timestamp ) UC
DECLARE @PQuery varchar(MAX) = '
SELECT * FROM (SELECT ID, CONVERT(varchar(5),Timestamp,108) AS Timestamp, Value FROM Table1 T0) T1
PIVOT (MAX([value]) FOR CONVERT(varchar(5),Timestamp,108) IN (' + @PivotColumnHeaders + ') ) AS P'
EXECUTE (@PQuery)