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

SQL-CASE WHEN-数据在转置后显示在单独的行上,sql,multiple-columns,transpose,case-when,Sql,Multiple Columns,Transpose,Case When,我正在尝试将列数据转换为单独的列。请注意,我不能使用Pivot函数或动态SQL 源表有三列:年份、城市、数据1 为了比较选定城市的数据,我尝试将“城市”列转换为单独的列 这是我的密码: 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

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

源表有三列:年份、城市、数据1

为了比较选定城市的数据,我尝试将“城市”列转换为单独的列

这是我的密码:

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
结果如下表所示

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

谢谢你的帮助

表输入示例:

+------+---------------+-------+
| 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/SUMCASE 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 |
+------+-------+-------+-------+
您可以尝试使用条件聚合函数


如果城市中有多个数据1,您可以尝试使用SUM而不是MAX,您可以尝试使用SUM函数

SELECT  t.year1, 
            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, t.data1
ORDER BY t.year

当每年和每个城市都有多个数据1时,您希望得到什么?也许是吧?你的DBMS是什么?结果仍然显示同年的DATA1 3次示例:1750 SF DATA1A,1750 NYC DATA1B,1750 PAR DATA1C。基本上,我希望每个城市的数据1只在一个“年”行上。澄清一下,我不是在总结数据1,因为data1列中的每一行都是不同的。@欧几里德教授,你能提供一些样本数据并期望结果吗?我编辑了这个问题以添加样本输入和输出表。你的样本数据中2003年和2004年在哪里?我的查询工作很好,我的分组方式与你的不同。我只按t年分组。你的答案和我的有什么区别?按条款分组
SELECT  t.year1, 
            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, t.data1
ORDER BY t.year