如何使用文本标识符和数字值来转动表格?
这是我的表(服务):
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 ;
答案 0 :(得分:2)
在我见过的每个PIVOT示例中,您必须从Derived表中选择,而不是直接从表中选择。
哦,同样根据this answer,你不要在你的列名中加上单引号。
显然你必须做这样的事情:
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
答案 1 :(得分:1)
您的问题是[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
中做了各种各样的事情。这不是问题,但经常发生。