首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Sql Server中将行透视为列

在Sql Server中将行透视为列
EN

Stack Overflow用户
提问于 2019-09-04 22:02:43
回答 1查看 31关注 0票数 1

我有一个样例表,如下所示:

代码语言:javascript
复制
+------+-------------+---------+----------+
| Year |   Country   | Ranking | Category |
+------+-------------+---------+----------+
| 2018 | Ghana       |       1 | Swimming |
| 2018 | Sweden      |       2 | Swimming |
| 2018 | Costa Rica  |       3 | Swimming |
| 2018 | Jordan      |       1 | Sprint   |
| 2018 | Thailand    |       2 | Sprint   |
| 2018 | Finland     |       3 | Sprint   |
| 2018 | Myanmar     |       1 | Boxing   |
| 2018 | Peru        |       2 | Boxing   |
| 2018 | Belgium     |       3 | Boxing   |
| 2017 | Nigeria     |       1 | Swimming |
| 2017 | Philippines |       2 | Swimming |
| 2017 | Haiti       |       3 | Swimming |
| 2017 | Netherlands |       1 | Sprint   |
| 2017 | Macedonia   |       2 | Sprint   |
| 2017 | Kuwait      |       3 | Sprint   |
| 2017 | Malaysia    |       1 | Boxing   |
| 2017 | New Zealand |       2 | Boxing   |
| 2017 | Palau       |       3 | Boxing   |
+------+-------------+---------+----------+

并且需要创建一个如下所示的报告:

代码语言:javascript
复制
+----------+---------+-------------+------------+
| Category | Ranking |    2017     |    2018    |
+----------+---------+-------------+------------+
| Swimming |       1 | Nigeria     | Ghana      |
| Swimming |       2 | Philippines | Sweden     |
| Swimming |       3 | Haiti       | Costa Rica |
| Sprint   |       1 | Netherlands | Jordan     |
| Sprint   |       2 | Macedonia   | Thailand   |
| Sprint   |       3 | Kuwait      | Finland    |
| Boxing   |       1 | Malaysia    | Myanmar    |
| Boxing   |       2 | New Zealand | Peru       |
| Boxing   |       3 | Palau       | Belgium    |
+----------+---------+-------------+------------+

我已经搜索了pivot示例,但似乎都使用了聚合函数,我认为这些聚合函数不适用于我的情况。

这就是我被困住的地方:

代码语言:javascript
复制
SELECT *
FROM
(
   SELECT Category
         ,Country
         ,Ranking
         ,[Year]
   FROM table1
 ) AS SourceTable PIVOT(<b><font color="red"> ?? </font></b> FOR [Year] IN ([2017], [2018])) AS PivotTable;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-04 23:44:30

我认为条件聚合是达到预期结果的最简单方法。

您可以对CategoryRanking进行分组,然后使用case语句计算2017和2018列,最后使用max删除null

代码语言:javascript
复制
declare @tmp table ([Year] int, Country varchar(50), Ranking int, Category varchar(50))
insert into @tmp values
     (2018, 'Ghana'       ,1, 'Swimming')
    ,(2018, 'Sweden'      ,2, 'Swimming')
    ,(2018, 'Costa Rica'  ,3, 'Swimming')
    ,(2018, 'Jordan'      ,1, 'Sprint')
    ,(2018, 'Thailand'    ,2, 'Sprint')
    ,(2018, 'Finland'     ,3, 'Sprint')
    ,(2018, 'Myanmar'     ,1, 'Boxing')
    ,(2018, 'Peru'        ,2, 'Boxing')
    ,(2018, 'Belgium'     ,3, 'Boxing')
    ,(2017, 'Nigeria'     ,1, 'Swimming')
    ,(2017, 'Philippines' ,2, 'Swimming')
    ,(2017, 'Haiti'       ,3, 'Swimming')
    ,(2017, 'Netherlands' ,1, 'Sprint')
    ,(2017, 'Macedonia'   ,2, 'Sprint')
    ,(2017, 'Kuwait'      ,3, 'Sprint')
    ,(2017, 'Malaysia'    ,1, 'Boxing')
    ,(2017, 'New Zealand' ,2, 'Boxing')
    ,(2017, 'Palau'       ,3, 'Boxing')

select 
      Category
    , Ranking 
    , max(case when [year] = 2017 then country else null end) as [2017] 
    , max(case when [year] = 2018 then country else null end) as [2018] 
From @tmp
group by 
    Category, Ranking 
order by 
    Category desc, Ranking 

输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57790153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档