我试图将列数据转换为单独的列。 (注意,我不能使用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 / 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
注意
如果在data1
上有多个city
你可以尝试使用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