SQL - CASE WHEN - Данные отображаются в отдельных строках после транспонирования - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь перенести данные столбца в отдельные столбцы.(Обратите внимание, что я не могу использовать функцию Pivot или динамический SQL).

Исходная таблица состоит из трех столбцов (год, город, данные1).

Я пытаюсь транспонировать столбец 'city'в отдельные столбцы для сравнения данных по выбранным городам.

Вот мой код:

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' дублируется несколько раз, в то время как я хотел бы, чтобы данные отображались в одной строке '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 (CASEWHEN)

+------+-------+-------+-------+
| 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 |
+------+-------+-------+-------+

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы можете попробовать использовать функцию суммы

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
0 голосов
/ 19 сентября 2018

Вы можете попытаться использовать агрегатную функцию условия

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

...