SQL查询选择谜语



我有一个sql查询谜语。从我设法从 DB 检索数据的临时表 (#tmp( 中,我必须对选择重新排序以满足需要数据的类的需求。 示例中的表格经过足够简化,只是为了了解需要什么。 从 #tmp 开始,有"人员"列,名为"类"的第二列包含每个人都可以参加的classId。 最多存在 13 个类。FieldOne 列和 FieldTwo 列是存储每个人和该人员参加的每个班级所需数据的列。

#tmp

Person          Classes         FieldOne            FieldTwo
----------      ----------      ----------          ----------
1               1               90.00               30.00   
1               2               80.00               30.00   
1               3               70.00               30.00   
2               1               90.00               30.00   
2               2               80.00               30.00   
3               1               90.00               30.00   
3               2               80.00               30.00   
3               3               70.00               30.00   
3               4               60.00               30.00   
...             ...             ...                 ...     

我需要从 #tmp 表中选择,以便每个人只获得一行,该行中的所有 13 个类。 对于每个类,需要两列 FieldOne 和 FieldTwo,如果没有数据(例如,人员 1 不参加表中的类编号 4 #tmp(,则应存储 0.00。 列表中可以有 n 人,但他们只能参加 13 节课。每个人的一行必须具有 personId、所有 13 个类的 FieldOne 和 FieldTwo 的值,以及由其他表中的人员 ID 联接的其他一些数据。

需要的选择

Person          ClassID_1-      ClassID_1-      ClassID_2-      ClassID_2-      ClassID_3-      ClassID_3-      ClassID_4-      ClassID_4-      ...
FieldOne        FieldTwo        FieldOne        FieldTwo        FieldOne        FieldTwo        FieldOne        FieldTwo        ...
----------      ----------      ----------      ----------      ----------      ----------      ----------      ----------      ----------      ...
1               90.00           30.00           80.00           30.00           70.00           30.00           0.00            0.00            ...
2               90.00           30.00           80.00           30.00           0.00            0.00            0.00            0.00            ...
3               90.00           30.00           80.00           30.00           70.00           30.00           60.00           30.00           ...
4...

实现所需目标的最佳方法是什么?如果有更流畅的方法需要修改需要数据的类,也可以这样做,但我更喜欢它保持原样。

使用聚合:

select person,
max(case when classid = 1 then field1 end) as field1_1,
max(case when classid = 1 then field2 end) as field2_1,
max(case when classid = 2 then field1 end) as field1_2,
max(case when classid = 2 then field2 end) as field2_2,
max(case when classid = 3 then field1 end) as field1_3,
max(case when classid = 3 then field2 end) as field2_3,
max(case when classid = 4 then field1 end) as field1_4,
max(case when classid = 4 then field2 end) as field2_4,
. . . 
from t
group by person;

唯一需要注意的是,您需要知道结果集中有哪些列,即所需的类 ID 数。

如果您不知道,则需要动态构造查询。 同样的想法也成立,但您在字符串中进行查询,然后执行它。

最新更新