根据某些列值重构 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。您的问题需要一个数据库标签。但是,如果您使用“动态数据透视”搜索您的数据库,您可能会找到示例代码。 pivottranspose 有什么区别? (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 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL:将列值链接到列名以满足某些条件

按列值查询某些行的联合和分组

sql一列有多值查询,根据多个只查询我想要的数据

使用 SQL 数据库查询以不同的时间间隔减去相同的列值

重置前根据增加的列值选择最后一行?

Sql Server 查询,一共三列,怎样查出第一个列值相同,第二列值最大的第三列的值?