2010-10-26 45 views
1

例如,我需要從如何在sql server 2005/8中創建沒有聚合函數的Column to Row?

alt text

改變

alt text

我知道PIVOT就是爲了這個,但它需要一個聚合函數;對於我的情況,我不需要聚合只需要列到行。如果有將是一個創紀錄的主題,你可以使用MIN或MAX

CREATE TABLE[StudentScores] 
( 
[UserName] NVARCHAR(20), 
[Subject] NVARCHAR(30), 
[Score]FLOAT, 
) 
GO 

INSERT INTO[StudentScores]SELECT'Nick','Chinese',80 

INSERT INTO[StudentScores]SELECT'Nick','Maths',90 

INSERT INTO[StudentScores]SELECT'Nick','English',70 

INSERT INTO[StudentScores]SELECT'Nick','Biology',85 

INSERT INTO[StudentScores]SELECT'Kent','Chinese',80 

INSERT INTO[StudentScores]SELECT'Kent','Maths',90 

INSERT INTO[StudentScores]SELECT'Kent','English',70 

INSERT INTO[StudentScores]SELECT'Kent','Biology',85 
+0

所以你實際上想要多列名爲'80','90','70','85'?或者你是否在爲每個用戶名尋找一行,每一列都是主題?在這種情況下,@OMG小馬的答案可以滿足你的需求,而且你可以看到你確實需要一個聚合。 – 2010-10-26 04:35:40

回答

1

您可以使用下面的示例數據。

SELECT * 
FROM [StudentScores] 
PIVOT 
(
    MIN(Score) 
    FOR [Subject] IN ([Chinese],[Maths],[English],[Biology]) 
) 
AS p 
1

我無法完全從您的原始問題中知道您想要轉換哪個字段 - 主題或分數。但是,您可以使用PIVOT來執行此操作。如果您知道想要從行更改爲列的列數,則可以使用靜態數據透視表(與其他答案相似)。如果你不知道改造的列數,那麼你可以使用動態透視:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(subject) 
        from test 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
     = 'SELECT username,' + @cols + ' from 
     (
      select username, subject, score 
      from test 
     ) x 
     pivot 
     (
      avg(score) 
      for subject in(' + @cols + ') 
     ) p ' 

execute(@query) 

SQL Fiddle with Demo

我用AVG()聚集在用戶每次主題不止一個得分事件。