2016-02-12 40 views
0

我对我自己的个人项目卡住了一个简单的SQL Server事情。SQL Server组和反向

我有一个表X:

| Name  | Lecture  | Points  | 
|:-----------|------------:|:------------:| 
| John  |  Math |  2  
| John  |  Bio |  5  
| Tom  |  Physics |  8  
| Tom  |  Math |  2  
| Bob  |  Physics |  1  
| Bob  |  Bio |  6 

我的名字,并把所有的点我一个排的每个人要组:

| Name  | Math | Bio | Physics | 
|:-----------|------:|:----:|:-------:| 
| John  | 2 | 5 | NULL  
| Tom  | 2 | NULL |  8  
| Bob  | NULL | 6 |  1  

我试着这样做:

SELECT Name, ? AS Math, ? AS Bio, ? AS Physics 
FROM X 
GROUP BY Name 

但我不知道该放什么而不是“?”。我怎样才能做到这一点 ?

+1

你需要做的无论是PIVOT或交叉表(也称为条件聚合)。 –

+0

是的,PIVOT会做得很好。对于简单的事例,如上例所示,它将非常简单直接。但是,如果您的透视列未知 - 您有艺术,西班牙,PE等 - 并且可以创建更多,您将需要查看创建动态PIVOT。这两个主题都在堆栈交换中很好地覆盖 –

回答

0

你需要一个数据透视表,你需要知道的值,除非你想使用动态SQL(不推荐,除非绝对必要):

SELECT Name, 
    ISNULL([Math], 0) as [Math], 
    ISNULL([Bio], 0) as [Bio], 
    ISNULL([Physics], 0) as [Physics] 
FROM 
(
    SELECT Name, Lecture, SUM(Points) 
    FROM Table X 
    GROUP BY Name, Lecture 
) as t1 
PIVOT (SUM([Points]) for [Lecture] in ([Math], [Bio], [Physics])) as t2