sql pivot没有聚合

时间:2010-10-23 15:11:48

标签: sql pivot aggregate pivot-without-aggregate

在尝试透视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

3 个答案:

答案 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的顺序。