Sql server 如何取消pivot,然后透视表,使列变为行,一列变为行?
我如何使用unpivot和pivot实现这一点。 我以前见过有人问这个问题,有一个案例陈述和联合的解决方案 在这里,我有20行24列,查询会变得很长,我怀疑效率很低。是否有人知道我如何使用unpivot和pivot实现这一点,或者case和union是唯一可行的选择Sql server 如何取消pivot,然后透视表,使列变为行,一列变为行?,sql-server,tsql,Sql Server,Tsql,我如何使用unpivot和pivot实现这一点。 我以前见过有人问这个问题,有一个案例陈述和联合的解决方案 在这里,我有20行24列,查询会变得很长,我怀疑效率很低。是否有人知道我如何使用unpivot和pivot实现这一点,或者case和union是唯一可行的选择 Hour A B C D E ... Z ----------------------------------------- 0 4 2 3 0 6 2 1 3 5 7 1 8
Hour A B C D E ... Z
-----------------------------------------
0 4 2 3 0 6 2
1 3 5 7 1 8 7
2 2 6 1 1 4 3
3 2 2 0 3 0 2
4 3 9 6 2 2 8
...
23 6 5 2 3 8 6
Field 0 1 2 3 ...23
-------- -- -- -
A 2 0 2 2 4
B 7 2 8 1 6
....
Z 6 7 7 3 8
这是我在pivot方面尝试过的,但我没有走远:
select B,[0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23] from CTE2
pivot(
sum(A)
for hour in ([0],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23])) as pvt;
澄清一下,表中的数字只是我用来模拟数据的随机数,它们没有按应有的方式进行转换。好吧,我知道你说你已经解决了这个问题,所以这可能是不必要的,你可以随意使用你目前的答案,但这里有一个例子,说明了如何处理这个问题
IF OBJECT_ID('tmpTable', 'U') IS NOT NULL DROP TABLE tmpTable;
CREATE TABLE tmpTable (i INT, a INT, b INT, c INT, d INT);
INSERT tmpTable VALUES (1,69,69,10,1)
, (2,5,0,2,3)
, (3,5,5,5,5)
, (4,1,2,3,4);
DECLARE @applycols NVARCHAR(MAX);
SELECT @applycols = STUFF(
(SELECT ',(' + QUOTENAME(COLUMN_NAME) + ', ''' + COLUMN_NAME + ''')'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tmpTable'
AND COLUMN_NAME <> 'i'
FOR XML PATH ('')),1,1,'');
DECLARE @aggcols NVARCHAR(MAX) = '';
SELECT @aggcols += ', MAX(CASE WHEN i = ' + CAST(i AS NVARCHAR(255)) + ' THEN piv.colval END) ' + QUOTENAME(CAST(i AS NVARCHAR(255)))
FROM tmpTable;
DECLARE @SQL NVARCHAR(MAX) = 'SELECT piv.col' + @aggcols + '
FROM tmpTable
CROSS APPLY (VALUES ' + @applycols + ') piv(colval, col)
GROUP BY piv.col;';
EXEC(@SQL);
DROP TABLE tmpTable;
本质上,它使用动态SQL确定所有列/值,然后使用简单的交叉应用/MAXCASE。。。获取所有值 在我分享的第一个链接中,我似乎已经用Zugwalt的解决方案解决了这个问题。如果我有时间的话,我会尝试稍后发布我自己的答案现在是凌晨2:15