3

在尝试旋转 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
4

3 回答 3

0

删除 Max Functions 和 group by

SELECT dy, CASE WHEN period = 1 THEN subj ELSE NULL END AS P1, CASE WHEN period = 2 THEN subj ELSE NULL END AS P2
FROM Classes

于 2010-10-23T15:16:56.023 回答
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
于 2010-10-23T15:19:49.843 回答
0

您的示例数据和您想要的输出不匹配。输出中的 Mth、CS2、Lab 和 Hu 值来自哪里?它们不在输入中。

目前尚不完全清楚您要做什么,但假设(例如)Mon 的输出中的单独行代表两个不同的学生,您需要在 SELECT 列表和 GROUP BY 中包含区分列(StudentID)条款。然后您可以安全地使用 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 的顺序。

于 2010-10-23T16:34:26.777 回答