сводная таблица с текстовым идентификатором и числовым значением - PullRequest
0 голосов
/ 08 июня 2018

Как повернуть таблицу с текстовым идентификатором и числовым значением?

Это моя таблица (услуги):

Street   | Service       | Total
---------|---------------|------
Street A | Service AA 01 | 20
Street A | Service AB 01 | 10
Street A | Service AB 01 | 15
Street A | Service AC 01 | 05
Street B | Service AA 01 | 10
Street B | Service AA 01 | 03
Street B | Service AB 01 | 05
Street B | Service AC 01 | 03

Это результат, который я хочу:

Street   | Service AA 01 | Service AB 01 | Service AC 01
---------|---------------|---------------|--------------
Street A |            20 |            25 |            05
Street B |            13 |            05 |            03

Что я пробовал до сих пор:

SELECT Street, ['SERVICE AA 01'], ['SERVICE AB 01'], ['SERVICE AC 01']
FROM services PIVOT (
  SUM(Total) FOR Service IN (['SERVICE AA 01'], ['SERVICE AB 01'], ['SERVICE AC 01'])) AS D

Получил улицы, все колонны, но все значения всегда null ;

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Ваша проблема в том, что [SERVICE AA 01] и ['SERVICE AA 01'] не ссылаются на одинаковые имена столбцов.Второй имеет одинарные кавычки в имени столбца - очень плохая практика, и это не оспаривается.

Я сделаю редакционный комментарий, что если вы назвали столбцы подчеркиванием, а не пробелами (SERVICE_AA_01),тогда вам не нужно будет бежать от них.И вы, вероятно, не цитировали бы их тоже.И у тебя не было бы этой проблемы.Просто говорю.Хорошие соглашения об именах могут предотвратить проблемы и путаницу.

Я бы также использовал условное агрегирование:

select street,
       sum(case when Service = 'SERVICE AA 01' then total end) as [SERVICE AA 01],  
       sum(case when Service = 'SERVICE AB 01' then total end) as [SERVICE AB 01], 
       sum(case when Service = 'SERVICE AC 01' then total end) as [SERVICE AC 01] from services
group by street;

Я не считаю синтаксис pivot особенно мощным или лаконичным.Как указывает Tab, подзапрос обычно используется, потому что посторонние столбцы делают нечестивые вещи в pivot.Это не проблема в этом случае, но это часто происходит.

0 голосов
/ 08 июня 2018

В каждом примере PIVOT, который я когда-либо видел, вы должны начать с выбора из производной таблицы, а не непосредственно из таблицы.

О, а также согласно этому ответу , вы не помещаете одинарные кавычки в имена столбцов.

Так что, очевидно, вы должны сделать что-то вроде этого:

SELECT Street, [SERVICE AA 01], [SERVICE AB 01], [SERVICE AC 01]
FROM (SELECT Street, Service, Total FROM services) AS S
PIVOT (
  SUM(Total) FOR Service IN ([SERVICE AA 01], [SERVICE AB 01], [SERVICE AC 01])) AS D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...