【问题标题】:SQL query selection riddle [duplicate]SQL查询选择之谜[重复]
【发布时间】:2020-02-03 11:57:14
【问题描述】:

我有一个 sql 查询之谜。从我设法从数据库中检索数据的临时表 (#tmp) 中,我必须重新排序选择以满足期望数据的类的需要。 示例中的表格已经足够简化,只是为了了解需要什么。 从#tmp 开始,有Person 列,名为Classes 的第二列包含每个人都可以参加的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,并且在没有数据的情况下(例如,#tmp 表中的人1 没有参加班级编号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...

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

【问题讨论】:

标签: c# mysql sql stored-procedures


【解决方案1】:

使用聚合:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多