【问题标题】:Restructure the SQL query based on some column value根据某些列值重构 SQL 查询
【发布时间】: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查询)

标签: 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 |
+------+-----+-------+-------+-----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2015-03-09
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多