我有一个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...
实现所需的最佳方法是什么?如果有一种更平滑的方法需要修改期望数据的类,也可以这样做,但是我希望它保持原样。
答案 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的数量。
如果您不知道,则需要动态构建查询。同样的想法仍然有效,但是您可以在字符串中进行查询,然后执行它。