2014-04-28 205 views
0

我正在努力解决查询输出问题。请参阅样本数据:SQL Server数据透视表指定列

CREATE TABLE #Subject (ID INT PRIMARY KEY IDENTITY, Name NVARCHAR(50)) 
CREATE TABLE #Student (ID INT PRIMARY KEY IDENTITY, Name NVARCHAR(50)) 
CREATE TABLE #Grade (ID INT PRIMARY KEY IDENTITY, 
     StudentID INT REFERENCES #Student(ID), 
     SubjectID INT REFERENCES #Subject(ID), 
     Grade NVARCHAR(50), GradeText NVARCHAR(50)) 

INSERT INTO #Subject (Name) VALUES 
(N'Maths'), 
(N'Physics'), 
(N'English') 

INSERT INTO #Student (Name) VALUES 
(N'Joe'), 
(N'Tom'), 
(N'Sally'), 
(N'Fred'), 
(N'Kim') 

INSERT INTO #Grade 
    ( StudentID, SubjectID, Grade, GradeText) VALUES 
(1,1,'Current','A'), 
(2,3,'Expected','C'), 
(3,2,'Mid','F'), 
(4,1,'Final','B'), 
(5,2,'Pre','C'), 
(2,3,'Start','A'), 
(3,1,'Current','A'), 
(1,2,'Expected','B'), 
(4,1,'Final','D'), 
(5,3,'Mid','E') 

SELECT * FROM #Student 
SELECT * FROM #Subject 
SELECT * FROM #Grade 

对于输出级我想设置一些档次列中的重要级别类型的是他们自己的列。即Current,Final我希望将其创建为具有相关成绩的自己的专栏,但是其他人可以仅列出,因为它们不重要。这是一个非常简单的例子,我正在使用的数据更加复杂。

是他们的方式来指定要创建的重要列作为自己的列和其他数据才能按照正常情况列出?另外,我看到的所有示例都是从一个表中查询的。当你查询时会发生什么事情有很多连接?

+0

感谢您的样本数据(我已经清理了一些以更好地适应在屏幕上)。这些数据的预期结果是什么? –

回答

1

你瞄准这样的事情:

;with x as (
    select * 
    from (
     select StudentID, SubjectID, Grade, GradeText, Grade as grade_1, GradeText as GradeText_1 
      from (
      select * 
      from #Grade 
     ) as x 
    ) as source 
    pivot (
     max(GradeText_1) 
     for Grade_1 in ([Current], [Final]) 
    ) as pvt 
) 
select sub.Name as Subject, st.Name as Student, Grade, GradeText, [Current], Final 
from x 
inner join #Subject sub on x.SubjectID = sub.ID 
inner join #Student st on x.StudentID = st.ID 
+0

是的,我相信这正是我所追求的!你能解释一下MAX函数在这种情况下做什么吗? MAX只是选择最高的数字不是吗?它在这种情况下如何适用? – jhowe

+0

只是在这种情况下将其视为NOOP,它只是每行的单个值。 (但是,agregate功能仍然是要求) – dean

+0

什么是NOOP? – jhowe