我有几张表格,上面列着不同科目的卷号、主题名和标记。
地质学、数学、物理、生物学等学科共有25门,它们在数据库中被混在一起,比如某地,数学在第三栏,它的标记在第四栏,在第十三列,在第十四栏。标记总是与自己的主题相邻。
是否有任何SQL查询可以安排所有这些主题?
就像所有的生物学一样,科目将出现在第一栏,而它的标记将出现在下一栏。
查询应搜索表格中的所有生物学科目,并将其放在第一栏中,同时从发现生物学的地方替换该栏,即列在第一栏中的主题名称及其标记。
例如:如果第一排有数学,第二排有数学分数,生物在第5栏,生物在第6栏,则应将第1列改为5,第2栏改为6。
发布于 2015-12-20 20:51:47
有两种方法可以做到这一点。第一种方法是对列进行UNION ALL
:
SELECT id, col1 AS subject, col2 AS mark FROM table
UNION ALL
SELECT id, col3, col4 FROM table
UNION ALL
...
通过这种方式,您可以创建一个应该用来将其转换为id、subject、mark表的查询。如果您真的不想这样做,那么您可以使用它重新创建您的表:
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
https://stackoverflow.com/questions/34384894
复制相似问题