admin

根据特定的列值将SQL列拆分为多个列

sql

我想写一个查询,列出我们大学提供的课程。一个程序至少包括一个主要的,可能包括一个“选项”,一个“专业”和一个“子专业”。这四个元素中的每个元素都有详细的代码,该代码将它们与专业相关。

一个专业可以有零个或多个选项,一个选项可以有零个或多个选项,而一个专业可以有零个或多个子选项。相反,允许专业没有与其相关的选择。

在结果集中,一行必须包含前一个元素才能具有下一个元素,即,一行将不包含major,no
option和speciality。与专业相关的专业的出现意味着也存在与该专业相关的选项。

我的问题在于如何存储数据。所有程序数据都位于一张这样的表中:

+----------------+---------------+------+
| program_name   | program_level | code |
+----------------+---------------+------+
| Animal Science | Major         |    1 |
| Equine         | Option        |    1 |
| Dairy          | Option        |    1 |
| CLD            | Major         |    2 |
| Thesis         | Option        |    2 |
| Non-Thesis     | Option        |    2 |
| Development    | Specialty     |    2 |
| General        | Subspecialty  |    2 |
| Rural          | Subspecialty  |    2 |
| Education      | Major         |    3 |
+----------------+---------------+------+

所需的输出将如下所示:

+----------------+-------------+----------------+-------------------+------+
| major_name     | option_name | specialty_name | subspecialty_name | code |
+----------------+-------------+----------------+-------------------+------+
| Animal Science | Equine      |                |                   |    1 |
| Animal Science | Dairy       |                |                   |    1 |
| CLD            | Thesis      | Development    | General           |    2 |
| CLD            | Thesis      | Development    | Rural             |    2 |
| CLD            | Non-Thesis  | Development    | General           |    2 |
| CLD            | Non-Thesis  | Development    | Rural             |    2 |
| Education      |             |                |                   |    3 |
+----------------+-------------+----------------+-------------------+------+

到目前为止,我已经尝试创建四个连接到此“代码”上的查询,每个查询均基于不同的“ program_level”进行选择。这些字段合并不正确。


阅读 230

收藏
2021-07-01

共1个答案

admin

我找不到比这更简单的方法:

/* Replace @Programs with the name of your table */

SELECT majors.program_name, options.program_name, 
    specs.program_name, subspecs.program_name, majors.code
FROM @Programs majors
LEFT JOIN @Programs options 
    ON majors.code = options.code AND options.program_level = 'Option'
LEFT JOIN @Programs specs 
    ON options.code = specs.code AND specs.program_level = 'Specialty'
LEFT JOIN @Programs subspecs 
    ON specs.code = subspecs.code AND subspecs.program_level = 'Subspecialty'
WHERE majors.program_level = 'Major'

编辑:纠正错字“ Speciality”,它现在应该可以使用。

2021-07-01