2014-04-16 50 views
0

Table strucuture不能够基于某些条件

在图像上方,我已示出的表结构我使用学生的结果存储到多个行组合成单排。不过,我需要选择这样的数据,使得取决于特定的FEID(检查ID), 我获得了单个学生的标记和单个学生的子ID。类似下面:

FEID SubID1 MarksObtained SubID2 MarksObtained SubID3 MarksObtained StdID 
2  1  0    2  0    3  0    50   
2  1  45    2  45    3  45    51 

结果栏不会影响结果为特定stdID和FEID它仍然同样为无论多少子ID怎么在那里。 基本上,我将每个主题标记存储在单个行中,主题可以是任何数字(在这种情况下超过3个),这在手前是未知的。但对于每个我创建一行来输入其标记

我试过下面的sytax。

DECLARE @cols nvarchar(MAX); 
    --get the list of subids from the table 
    SELECT @cols = SubjectName from tbSubjects where SubID IN(select distinct SubID from tbFinalMarks); 

    Declare @sql nvarchar(MAX) = 'SELECT StdId, FEID, ' + @cols + 'FROM 
    (
    SELECT * FROM tbFinalMarks 
    )t 
    PIVOT 
    (
     MAX(MarksObtained) FOR SubId IN (' + @cols + ') 

)p'; 
+0

您需要使用数据透视表来执行此操作。 – pquest

+0

我从来没有使用数据透视表。是否有任何我可以查找相同的参考 –

+0

我将添加一个答案,显示一个例子 – pquest

回答

1

像这样的事情一定会做到。它也会动态地为新的子标识添加新的列,而无需担心。

DECLARE @cols nvarchar(MAX); 
    --get the list of subids from the table 
    SELECT @cols = COALESCE(@cols + ',', '') + '[' + CAST(SubId AS nvarchar) + ']' FROM (SELECT DISTINCT SubId FROM table); 

    Declare @sql nvarchar(MAX) = 'SELECT StdId, FEID, ' + @cols + 'FROM 
    (
    SELECT * FROM table 
    )t 
    PIVOT 
    (
     MAX(MarksObtained) FOR SubId IN (' + @cols + ') 

)p'; 

EXECUTE sp_executesql @sql; 
+0

其投掷错误,colum1被多次指定 –

+0

我刚编辑答案。我忘了一个独特的。 – pquest

+0

它不工作,我修改了一下,我现在得到的主题名称的基础上,他们的ID为... –

0

虽然可以使用pivot,我想明确的聚合方式是更容易构造:

select feid, 
     1 as SubId_1, 
     max(case when SubId = 1 then MarksObtained end) as MarksObtained_1, 
     2 as SubId_2, 
     max(case when SubId = 2 then MarksObtained end) as MarksObtained_2, 
     3 as SubId_3, 
     max(case when SubId = 3 then MarksObtained end) as MarksObtained_3, 
     stdid 
from table t 
group by feid, stdid; 
+0

预先不知道绑定在一起的行数,在上面的情况下它是三个该考试只有3门科目。如果考试有5个科目,则会创建5行。所以我认为在查询中需要循环索引。 ! @Gordon Linoff –