2

我有这样的约会

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 它没有给出想要的输出建议我

4

2 回答 2

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

于 2013-10-18T08:25:17.907 回答
0

您的查询不起作用,因为它根据行的值对行进行编号,因此无论它们进入的顺序如何,具有最低值的行都将排在第一位。如果其他行都具有 InterviewType =1,则具有 InterviewType 5 的行将始终具有最高的行号。

如果没有唯一标识哪些条目应该放在一起的方法,则无法保证从 SQL Server 中的查询返回的顺序。但是,如果您的数据采用上述确切格式 - 因此行始终采用 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,依此类推)

于 2013-10-18T08:25:08.283 回答