如何使用pivot将行创建到列中

时间:2013-10-18 07:58:51

标签: sql-server-2008 tsql pivot

我有这样的约会

Name              VALUE
ClientID     M01010001250
InterviewType   1
InterviewDate   7/8/2011
ClientID    M01010001260
InterviewType   1
InterviewDate   7/8/2011
ClientID    M01010001260
InterviewType   5
InterviewDate   1869-07-01
ClientID    M01010001290
InterviewType   1
InterviewDate   7/8/2011

现在我的出局应该是这样的

SEQ   ClientID  InterviewType   InterviewDate
1   M01100016550    5   9/9/2011
2   M01100016550    5   9/9/2011
3   M01030000680    5   9/9/2011

我使用pivot编写了一个查询:

SELECT SEQ,ClientID,InterviewType,InterviewDate
FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY NAME,VALUE ORDER BY NAME,VALUE) AS SEQ,NAME,VALUE
FROM Table1) DT
PIVOT (MAX(VALUE)FOR NAME IN(ClientID,InterviewType,InterviewDate))DT1
ORDER BY SEQ

即使我使用的是row_number,也没有提供所需的输出建议我

2 个答案:

答案 0 :(得分:1)

这里的问题是将所有行分为三个。我有一个有效的解决方案:

;WITH MyCTE AS
(
  SELECT  ROW_NUMBER() OVER (ORDER BY orderby) AS SEQ,
          NAME,
          VALUE
  FROM    (
            select  1 as orderby, 
                    * 
            from Table1 
          )t
 )

SELECT SEQ,
       ClientID,
       InterviewType,
       InterviewDate
FROM   (
          SELECT  ((SEQ-1)/3)+1 AS SEQ,
                  NAME,
                  VALUE
          FROM    MyCTE
       ) DT
PIVOT  ( 
          MAX(VALUE)
          FOR NAME 
          IN(ClientID,InterviewType,InterviewDate)
        )DT1
ORDER BY SEQ

您可能会找到SQL Fiddle Demo

答案 1 :(得分:0)

您的查询无效,因为它根据行的值对行进行编号,因此无论它们的顺序如何,具有最低值的行都将是第一个。如果其他行都具有InterviewType = 1,则具有InterviewType 5的行将始终具有最高的rownumber。

如果没有办法唯一地识别哪些条目应该一起使用,则无法保证从SQL服务器中的查询返回的顺序。但是,如果您的数据采用上述确切格式 - 因此行始终采用ClientId格式,然后是InterviewType,然后是InterviewDate,以下内容应该有效。

select  p.*
from    (select *,
        CEILING((ROW_NUMBER() OVER (ORDER BY (SELECT 1)) - 1) / 3) as [Row]
        from    Table1 t) t
PIVOT (max(value) for name in (ClientID, InterviewType, InterviewDate)) p

我的测试数据输出:

 0  M01050001250    16  7/8/2011
 1  M01010001260    1   7/8/2011
 2  M01010001260    5   1869-07-01
 3  M01010001290    1   7/8/2011

(天花板功能每三行编号 - 前三个为0,后三个为1,等等。)