SQL查询选择之谜

时间:2019-10-05 12:37:26

标签: c# mysql sql stored-procedures

我有一个sql查询谜语。从一个临时表(#tmp)中,我设法从数据库中检索数据,我必须对选择进行重新排序,以满足需要数据的类的需求。 示例中的表已被简化,足以使您了解需要什么。 在#tmp中,有Person列,第二列名为Classs包含每个人都可以参加的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没有参加#tmp表中的班级4),应该存储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...

实现所需的最佳方法是什么?如果有一种更平滑的方法需要修改期望数据的类,也可以这样做,但是我希望它保持原样。

1 个答案:

答案 0 :(得分:0)

使用聚合:

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的数量。

如果您不知道,则需要动态构建查询。同样的想法仍然有效,但是您可以在字符串中进行查询,然后执行它。