我有这样的约会
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,也没有提供所需的输出建议我
答案 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,等等。)