2013-10-18 60 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