sql - 将数据转换为多列

标签 sql sql-server pivot

我有很多客户,每个客户有 67 条记录。

该记录包含事件、日期、ID、标志和许多其他列。

我希望事件名称是这些事件标题下方的标题和日期。

我正在尝试使用下表对其进行更多解释。这是当前的输出:

Client  Activity    Date 
1       A           21/15
1       B           5/5/2012
1       C           51/3115
1       D           54/6/84
2       A           8/6/99
2       B           1/1/2011
2       C           8/4
2       D           9/81/1
3       A           6/51/8
3       B           1/61/8
3       C           1/31
3       D           3/2/1

我希望它是:
Client      A       B         C         D
1           21/15   5/5/2012  51/31/15  54/6/84
2           8/6/99  1/1/2011  8/4       9/81/1
3           6/51/8  1/61/8    1/31      3/2/1

最佳答案

您将要使用 PIVOT 为此功能。如果您知道要转换的列数,则可以通过静态数据透视对其进行硬编码:

select *
from
(
  select client, activity, dt
  from yourtable
) x
pivot
(
  max(dt)
  for activity in ([A], [B], [C], [D])
) p

SQL Fiddle with Demo

如果您的列数未知,请使用动态版本:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(activity) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT client,' + @cols + ' from 
             (
              select client, activity, dt
              from yourtable
            ) x
            pivot 
            (
                max(dt)
                for activity in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

最后,这也可以通过 CASE 来完成。语句和聚合函数(见 SQL Fiddle with Demo):
select client,
  max(case when activity = 'A' then dt end) as A,
  max(case when activity = 'B' then dt end) as B,
  max(case when activity = 'C' then dt end) as C,
  max(case when activity = 'D' then dt end) as D
from yourtable
group by client

关于sql - 将数据转换为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516357/

相关文章:

php - 如何从 SQL View 中进行 SELECT? (一般错误: 1615 Prepared statement needs to be re-prepared)

sql - 你怎么能阻止 NHibernate(通过 ActiveRecord)添加 this_.到公式中的表名

java - 如何使用 ResultSet JDBC 更新包含连接的 Select 字段

mysql - 如果还没有日期行,如何将最近的行从一个表连接到另一个表并包含所有行?

mysql - 如何在 MySQL 中返回数据透视表输出?

sql - 如何在oracle表中搜索新行字符?

mysql - 选择第一个字符是数字的地方

php - 在 php 中连接到 Linux 上的 MS SQL Server

oracle11g - Oracle - 返回总和以及旋转总和?

sql - 将数据从行合并到列