2013-10-18 55 views
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 

我已经写了使用数据透视查询,使行入列:

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

回答

0

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

没有办法唯一地标识哪些条目应该一起走,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等)

+0

这已经被问27分钟前,我们给出了与9秒差异....的答案! :)你第一次,虽然... –

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

+0

是的,它工作得很好你们都非常感谢你 – mohan111