我取消了将列转换为行的透视。 http://sqlfiddle.com/#!4/fc489/6
现在我想并排向学生显示类似
AVGGPA 1 1
COURSEAVG 101.5 101.5
STUDENTNAME Jilly Doe John Doe
任何提示??
如果你真的只有两个子集需要担心,那么在你目前所拥有的基础上构建的一个简单方法是:
SELECT labeln,
MAX(CASE WHEN rn = 1 THEN value1 END) AS col1,
MAX(CASE WHEN rn = 2 THEN value1 END) AS col2
FROM (
SELECT * FROM (
SELECT to_char(avg(g1.grade)) AS avgGPa,
to_char(avg(s1.course)) AS courseAVG,
s1.student_name AS studentName,
ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY s1.student_name) AS RN
FROM student s1
JOIN grade g1 ON s1.student_name = g1.student_name
GROUP BY s1.student_name
)
UNPIVOT (value1 FOR labeln IN (avggpa, courseavg, studentname))
)
GROUP BY labeln
ORDER BY labeln;
SQL 小提琴
它基本上是一个手动透视;向原始查询添加一个row_number()
,然后使用它来决定相应值进入哪一列,max()
折叠空白。您可以通过复制max(case(...))
位并更改rn
检查来轻松添加更多列。但是你必须知道你需要得到多少列;或者高估并在最后有一些空白。
理论上,您可以使用实际的pivot()
但事先不知道值,因此没有要在for
子句中使用的值。您也许可以使用 XML 方法,但这可能有点矫枉过正;这取决于您对此的实际用途。