在尝试透视sql表时,我遇到了这篇文章Here。通过使用此方法,我创建了一个查询。但是我现在意识到它当然会用MAX函数聚合结果。然而,我需要Colum旋转,但所有出现的事件都要显示。代码取自上面的帖子。
SELECT dy,
MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,
FROM Classes
GROUP BY dy
所以从本质上说我希望使用它但没有max函数?有任何想法吗?
编辑示例数据
Day Period Subject
Mon 1 Ch
Mon 2 Ph
Tue 1 Ph
Tue 2 Ele
Mon 1 Ch
Mon 2 Ph
Tue 1 Ph
Tue 2 Ele
示例输出
Day P1 P2
Mon Ch Ph
Mon Ch Ph
Tue Ph Ele
Tue Ph Ele
基本上如果数据输入两次就会出现两次......
编辑实际的sql ..
SELECT other
MAX(CASE WHEN period = 1 THEN table2.subj ELSE NULL END) AS P1,
MAX(CASE WHEN period = 2 THEN table2.subj ELSE NULL END) AS P2
FROM table1
left join table2 on table2.ID = subject
GROUP BY other
示例数据
表1
Dy Period Subject other
Mon 1 1 1
Mon 2 2 1
Tue 1 3 2
Tue 2 4 2
Mon 1 5 3
Mon 2 6 3
Tue 1 7 4
Tue 2 8 4
表2
ID Subj
1 ch
2 ph
3 ph
4 ele
5 ch
6 ph
7 ph
8 Ele
示例输出
Day P1 P2 other
Mon Ch Ph 1
Mon Ch Ph 3
Tue Ph Ele 2
Tue Ph Ele 4
答案 0 :(得分:0)
按
删除最大功能和组SELECT dy, CASE WHEN period = 1 THEN subj ELSE NULL END AS P1, 例如,当句点= 2时,主题为ELSE NULL END AS P2 FROM Classes
答案 1 :(得分:0)
信不信由你,你不必删除MAX()
聚合函数来获得所有结果。只需向GROUP BY子句添加更多条件,即可获得所需的行,以便获得所需的所有结果。
例如,如果dy
是唯一的,您将获得所有结果,但如果您有另一列使您的GROUP BY
子句唯一,则可以添加它,然后您将获得所有结果结果。假设该列名为`id':
SELECT dy,id,
MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,
FROM Classes
GROUP BY dy, id
答案 2 :(得分:0)
您的示例数据与所需的输出不匹配。 Mth,CS2,Lab和Hu值来自输出中的哪个位置?他们不在投入中。
您尝试做的事情并不完全清楚,但假设输出中的单独行(例如)Mon表示两个不同的学生,则需要在SELECT列表中包含区分列(StudentID), GROUP BY子句。然后你可以安全地使用MAX不聚合(因为每个输出单元只有一个值),而是欺骗引擎为你做转轴。
这是包含学生ID的SQL:
SELECT student_id, dy,
MAX(CASE WHEN period = 1 THEN subj ELSE NULL END) AS P1,
MAX(CASE WHEN period = 2 THEN subj ELSE NULL END) AS P2,
FROM Classes
GROUP BY student_id, dy
这将为每个学生返回一条记录,显示他们的每日课程安排。如果您希望输出按天和学生排序,请在SELECT和GROUP BY子句中颠倒student_id和dy的顺序。