根据某些列值重构 SQL 查询
Posted
技术标签:
【中文标题】根据某些列值重构 SQL 查询【英文标题】:Restructure the SQL query based on some column value 【发布时间】:2020-07-17 12:16:45 【问题描述】:假设有一个这样的表:
+-------+-------+--------+ |年份 |姓名 |成绩 | +-------+-------+--------+ |2019 |鲍勃 |80 | |2019 |大卫 |90 | |2019 |绿色 |92 | |2019 |汤姆 |85 | |2020 |鲍勃 |79 | |2020 |大卫 |87 | |2020 |绿色 |98 | |2020 |汤姆 |90 | +-------+-------+--------+我想写一个sql查询,想要的输出是这样的:
+-------+-------+-------+--------+-------+ |日期 |鲍勃 |大卫 |格林 |汤姆 | +-------+-------+-------+--------+-------+ |2019 |80 |90 |92 |85 | |2020 |79 |87 |98 |90 | +-------+-------+-------+--------+-------+有什么帮助吗?
【问题讨论】:
这能回答你的问题吗? SQL Transpose Rows as Columns 如果不知道具体的名字列表,就需要动态SQL。您的问题需要一个数据库标签。但是,如果您使用“动态数据透视”搜索您的数据库,您可能会找到示例代码。pivot
和 transpose
有什么区别? (ps:我在mysql表上应用sql查询)
【参考方案1】:
您可以使用PIVOT
子句。
SELECT * FROM table_name
PIVOT(
MAX(SCORE)
FOR YEAR
IN (
2019,
2020
)
)
ORDER BY NAME;
您可以查看link 了解更多详情。
【讨论】:
我认为您的意思是 MAX(SCORE) 而不是 COUNT(SCORE)。 我的错,我修好了。【参考方案2】:我已将姓名更改为 nm,将年份更改为 yr。试试这个:
Select distinct yr Date,
MAX(CASE WHEN nm = 'Bob' THEN score END) OVER (PARTITION BY yr)Bob,
MAX(CASE WHEN nm = 'David' THEN score END) OVER (PARTITION BY yr) David,
MAX(CASE WHEN nm = 'Green' THEN score END) OVER (PARTITION BY yr)Green,
MAX(CASE WHEN nm = 'Tom' THEN score END) OVER (PARTITION BY yr)Tom
from table
where yr in ('2019', '2020');
输出:
+------+-----+-------+-------+-----+
| date | Bob | David | Green | Tom |
+------+-----+-------+-------+-----+
| 2019 | 80 | 90 | 92 | 85 |
+------+-----+-------+-------+-----+
| 2020 | 79 | 87 | 98 | 90 |
+------+-----+-------+-------+-----+
【讨论】:
以上是关于根据某些列值重构 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章