Sql server 如何取消pivot,然后透视表,使列变为行,一列变为行?

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

我如何使用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     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