SQL - CASE WHEN - 转置后数据显示在单独的行上

标签 sql multiple-columns transpose case-when

我正在尝试将列数据转置到单独的列中。 (请注意,我不能使用 Pivot 函数或动态 SQL)。

源表有三列(year, city, data1)。

我正在尝试将“城市”列转置为单独的列,以便比较所选城市的数据。

这是我的代码:

SELECT  t.year, 
   CASE WHEN city = 'San Francisco' THEN t.data1 END) SF, 
   CASE WHEN city = 'Paris' THEN t.data1 END) PAR, 
   CASE WHEN city = 'New York' THEN t.data1 END) NYC
FROM t
WHERE city IN ('San Francisco', 'Paris', 'New York')
GROUP BY t.year, t.data1
ORDER BY t.year

结果如下表。

output

问题是“年”行重复了多次,而我希望所有选定城市的数据都显示在一个“年”行中。否则我无法绘制任何折线图。

感谢任何帮助。

表格输入示例:

+------+---------------+-------+
| year |     city      | data1 |
+------+---------------+-------+
| 2001 | San Francisco | 15.25 |
| 2001 | New York      | 10.93 |
| 2001 | Paris         | 11.37 |
| 2002 | San Francisco |    15 |
| 2002 | Paris         | 11.87 |
| 2002 | New York      | 11.25 |
| 2003 | Paris         | 11.91 |
| 2003 | New York      |  9.84 |
| 2003 | San Francisco | 15.43 |
| 2004 | New York      | 10.39 |
| 2004 | San Francisco | 15.37 |
| 2004 | Paris         | 11.34 |
| 2005 | Paris         | 11.55 |
| 2005 | New York      | 10.68 |
| 2005 | San Francisco | 15.17 |
+------+---------------+-------+

使用 CASE WHEN 或 MAX/SUM(CASE WHEN) 后的输出表

+------+-------+-------+-------+
| year |  sf   |  par  |  nyc  |
+------+-------+-------+-------+
| 2001 | 15.25 |       |       |
| 2001 |       |       | 10.93 |
| 2001 |       | 11.37 |       |
| 2002 |    15 |       |       |
| 2002 |       | 11.87 |       |
| 2002 |       |       | 11.25 |
| 2003 |       | 11.91 |       |
| 2003 |       |       |  9.84 |
| 2003 | 15.43 |       |       |
| 2004 |       |       | 10.39 |
| 2004 | 15.37 |       |       |
| 2004 |       | 11.34 |       |
| 2005 |       | 11.55 |       |
| 2005 |       |       | 10.68 |
+------+-------+-------+-------+

所需的输出格式(每年显示在一行中的所有数据):

+------+-------+-------+-------+
| year |  sf   |  par  |  nyc  |
+------+-------+-------+-------+
| 2001 | 15.25 | 11.37 | 10.93 |
| 2002 |    15 | 11.87 | 11.25 |
| 2003 | 15.43 | 11.91 |  9.84 |
| 2004 | 15.37 | 11.34 | 10.39 |
+------+-------+-------+-------+

最佳答案

可以尝试使用条件聚合函数

SELECT  t.year, 
   SUM(CASE WHEN city = 'San Francisco' THEN t.data1 END) SF, 
   SUM(CASE WHEN city = 'Paris' THEN t.data1 END) PAR, 
   SUM(CASE WHEN city = 'New York' THEN t.data1 END) NYC
FROM t
WHERE city IN ('San Francisco', 'Paris', 'New York')
GROUP BY t.year
ORDER BY t.year

注意

如果 city 上有多个 data1 你可以尝试使用 SUM 而不是 MAX

关于SQL - CASE WHEN - 转置后数据显示在单独的行上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394901/

相关文章:

pandas - 在保留索引列的同时在 Pandas 中转置 DataFrame

php - 将最高价格的变化设置为 Woocommerce 可变产品中的默认值

mysql - 如何将时间列分别分组为 5 分钟间隔和最大/最小值 SQL?

mysql - 在不同的列中显示一列的mysql结果

r - 在 Y 列数据的条件下转置 X 列数据

cuda - 在这篇 NVIDIA 博客文章中,为什么通过共享内存复制速度更快?

sql - 对于这个特定的数据库设计问题,您会使用哪种方法?

sql - Doctrine 2.1 DQL-多对多查询多个值-多个类别中的项目?

python - 创建一个新列,根据条件查找日期差异

C 将 float 组打印到列中