SQL 打乱列的查询
SQL query to shuffle columns
我有 tables,其中包含卷号列、主题名称和不同主题的标记。
总共有 25 个科目,例如地质学、数学、物理、生物学等。它们在数据库中以混洗的形式存在,例如数学在第三列中,其标记在第 4 列中,而在第 13 列中第 14 列中的标记。标记总是与自己的主题相邻。
有没有SQL可以安排所有这些科目的查询?
像所有生物科目一样,它的分数在第二列。
查询应搜索 table 中的所有生物学学科并将其放在第一列,同时替换发现生物学的那一列,第一列中的学科名称及其名称标记.
例如。如果对于卷号 100,如果第一行有数学,第二行有数学标记,生物学在第五列,其标记在第六列,它应该将第 1 列与 5 和第 2 列与 6 交换。
有两种方法可以做到这一点。第一种方法是 UNION ALL
列:
SELECT id, col1 AS subject, col2 AS mark FROM table
UNION ALL
SELECT id, col3, col4 FROM table
UNION ALL
...
通过这种方式,您可以创建一个查询,您应该使用它来将其转换为 ID、主题、标记 table。如果你真的不想那样,那么你可以用它来重新创建你的 table:
WITH subjects AS(
SELECT id, col1 AS subject, col2 AS mark FROM tbl
UNION ALL
SELECT id, col3, col4 FROM tbl
UNION ALL
...
)
SELECT id, bio.subject, bio.mark, math.subject, math.mark ...
FROM subjects AS bio
JOIN subject AS math ON bio.id=math.id
JOIN subject AS ...
WHERE bio.subject = 'biology' and math.subject = 'math' and ...
另一种(可能更有效的方法是使用 CASE
语句
SELECT CASE WHEN col1 = 'biology' THEN col2
ELSE WHEN col3 = 'biology' THEN col4
ELSE ...
AS biology,
CASE WHEN col1 = 'math' ...
FROM tbl
我有 tables,其中包含卷号列、主题名称和不同主题的标记。
总共有 25 个科目,例如地质学、数学、物理、生物学等。它们在数据库中以混洗的形式存在,例如数学在第三列中,其标记在第 4 列中,而在第 13 列中第 14 列中的标记。标记总是与自己的主题相邻。
有没有SQL可以安排所有这些科目的查询?
像所有生物科目一样,它的分数在第二列。
查询应搜索 table 中的所有生物学学科并将其放在第一列,同时替换发现生物学的那一列,第一列中的学科名称及其名称标记.
例如。如果对于卷号 100,如果第一行有数学,第二行有数学标记,生物学在第五列,其标记在第六列,它应该将第 1 列与 5 和第 2 列与 6 交换。
有两种方法可以做到这一点。第一种方法是 UNION ALL
列:
SELECT id, col1 AS subject, col2 AS mark FROM table
UNION ALL
SELECT id, col3, col4 FROM table
UNION ALL
...
通过这种方式,您可以创建一个查询,您应该使用它来将其转换为 ID、主题、标记 table。如果你真的不想那样,那么你可以用它来重新创建你的 table:
WITH subjects AS(
SELECT id, col1 AS subject, col2 AS mark FROM tbl
UNION ALL
SELECT id, col3, col4 FROM tbl
UNION ALL
...
)
SELECT id, bio.subject, bio.mark, math.subject, math.mark ...
FROM subjects AS bio
JOIN subject AS math ON bio.id=math.id
JOIN subject AS ...
WHERE bio.subject = 'biology' and math.subject = 'math' and ...
另一种(可能更有效的方法是使用 CASE
语句
SELECT CASE WHEN col1 = 'biology' THEN col2
ELSE WHEN col3 = 'biology' THEN col4
ELSE ...
AS biology,
CASE WHEN col1 = 'math' ...
FROM tbl