Understanding PIVOT function in T-SQL(了解 T-SQL 中的 PIVOT 函数)
问题描述
我对 SQL 很陌生.
I am very new to SQL.
我有一张这样的桌子:
ID | TeamID | UserID | ElementID | PhaseID | Effort
-----------------------------------------------------
1  |   1    |  1      |   3       |  5     |   6.74
2  |   1    |  1      |   3       |  6     |   8.25
3  |   1    |  1      |   4       |  1     |   2.23
4  |   1    |  1      |   4       |  5     |   6.8
5  |   1    |  1      |   4       |  6     |   1.5
我被告知要获取这样的数据
And I was told to get data like this
ElementID | PhaseID1 | PhaseID5 | PhaseID6
--------------------------------------------
    3     |   NULL   |   6.74   |   8.25
    4     |   2.23   |   6.8    |   1.5
我知道我需要使用 PIVOT 功能.但是不能清楚的理解.如果有人可以在上述情况下解释它,那将是很大的帮助.(或任何替代方案,如果有的话)
I understand I need to use PIVOT function. But can't understand it clearly. It would be great help if somebody can explain it in above case.(or any alternatives if any)
推荐答案
A PIVOT 用于将数据从一列旋转到多列.
A PIVOT used to rotate the data from one column into multiple columns. 
对于您的示例,这里是一个 STATIC Pivot,这意味着您对要旋转的列进行硬编码:
For your example here is a STATIC Pivot meaning you hard code the columns that you want to rotate:
create table temp
(
  id int,
  teamid int,
  userid int,
  elementid int,
  phaseid int,
  effort decimal(10, 5)
)
insert into temp values (1,1,1,3,5,6.74)
insert into temp values (2,1,1,3,6,8.25)
insert into temp values (3,1,1,4,1,2.23)
insert into temp values (4,1,1,4,5,6.8)
insert into temp values (5,1,1,4,6,1.5)
select elementid
  , [1] as phaseid1
  , [5] as phaseid5
  , [6] as phaseid6
from
(
  select elementid, phaseid, effort
  from temp
) x
pivot
(
  max(effort)
  for phaseid in([1], [5], [6])
)p
这是一个带有工作版本的 SQL 演示.
Here is a SQL Demo with a working version.
这也可以通过动态 PIVOT 来完成,您可以在其中动态创建列列表并执行 PIVOT.
This can also be done through a dynamic PIVOT where you create the list of columns dynamically and perform the PIVOT.
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.phaseid) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
set @query = 'SELECT elementid, ' + @cols + ' from 
            (
                select elementid, phaseid, effort
                from temp
           ) x
            pivot 
            (
                 max(effort)
                for phaseid in (' + @cols + ')
            ) p '
execute(@query)
两者的结果:
ELEMENTID   PHASEID1    PHASEID5    PHASEID6
3           Null        6.74        8.25
4           2.23        6.8         1.5
                        这篇关于了解 T-SQL 中的 PIVOT 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:了解 T-SQL 中的 PIVOT 函数
				
        
 
            
        - 使用 Oracle PL/SQL developer 生成测试数据 2021-01-01
 - 导入具有可变标题的 Excel 文件 2021-01-01
 - 如何将 SonarQube 6.7 从 MySQL 迁移到 postgresql 2022-01-01
 - 以一个值为轴心,但将一行上的数据按另一行分组? 2022-01-01
 - 如何使用 pip 安装 Python MySQLdb 模块? 2021-01-01
 - SQL 临时表问题 2022-01-01
 - 如何将 Byte[] 插入 SQL Server VARBINARY 列 2021-01-01
 - 更改自动增量起始编号? 2021-01-01
 - 远程 mySQL 连接抛出“无法使用旧的不安全身份验证连接到 MySQL 4.1+"来自 XAMPP 的错误 2022-01-01
 - 在SQL中,如何为每个组选择前2行 2021-01-01
 
						
						
						
						
						
				
				
				
				