首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL Server中使用Pivot将行转换为列

在SQL Server中使用Pivot将行转换为列
EN

Stack Overflow用户
提问于 2017-11-19 18:46:57
回答 3查看 48关注 0票数 0

我有一个包含数据的表格:

代码语言:javascript
复制
date            Plant          Weight
2017-11-11  Gent        26
2017-11-11  Ang         25
2017-11-11  Ger         24
2017-11-11  ISS         23
2017-11-10  Gent        26
2017-11-10  Ang         25
2017-11-11  Ger         24
2017-11-11  ISS         23
2017-11-11  Gent        12
2017-11-11  Ang         13
2017-11-10  Gent        100

我希望它以数据透视表的形式出现,如下所示:

代码语言:javascript
复制
datum           Ang Gent  Ger  ISS
2017-11-10      25  126   0    0
2017-11-11      38   38  48   46

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2017-11-19 18:54:07

试试这个:

代码语言:javascript
复制
SELECT *
FROM myTable
PIVOT
(
   MAX(Weight) FOR [Plant] IN ([Ang], [Gent], [Ger], [ISS])
) PVT;
票数 0
EN

Stack Overflow用户

发布于 2017-11-20 20:58:54

首先,如果不想使用Pivot运算符,可以使用条件case表达式条件

代码语言:javascript
复制
SELECT DATE [datum],
          SUM(CASE(PLANT) WHEN 'Ang' THEN Weight ELSE NULL END) [Ang],
          SUM(CASE(PLANT) WHEN 'Gent' THEN Weight ELSE NULL END) [Gent],
          SUM(CASE(PLANT) WHEN 'Ger' THEN Weight ELSE 0 END) [Ger],
          SUM(CASE(PLANT) WHEN 'ISS' THEN Weight ELSE 0 END) [ISS]
FROM <table> GROUP BY [DATE]

另一种是动态pivot方式,如果您对条件case表达式不满意

代码语言:javascript
复制
DECLARE @Col NVARCHAR(MAX)
DECLARE @Query NVARCHAR(MAX)

SET @Col = STUFF((SELECT DISTINCT ','+QUOTENAME(PLANT) FROM <table> FOR XML PATH('')),1,1, '')

SET @Query = N'SELECT * FROM <table> 
                    PIVOT
                    (
                       sum(Weight) FOR [Plant] IN ('+@Col+')
                    ) PVT'

execute sp_executesql @Query

结果:

代码语言:javascript
复制
datum           Ang Gent  Ger  ISS
2017-11-10      25  126   0    0
2017-11-11      38   38  48   46
票数 0
EN

Stack Overflow用户

发布于 2017-11-22 17:25:55

代码语言:javascript
复制
select [datum],[Gent],[Ang],[ISS],[Ger],[Gent]+[Angouleme]+[ISS]+[Gerona] as [TOTAAL] FROM (select plant,datum,sum(weight) as weight FROM [MEPDARPD].[dbo].[Table1]  group by plant,datum)t
PIVOT
(
sum(Weight) 
FOR [Plant] IN ([Gent],[Ang],[ISS],[Ger])
) AS p

查询下面的行和列中的合计

代码语言:javascript
复制
select datum,
sum(case(plant) WHEN 'Ang' then weight else 0 END) as [Ang],
sum(case(plant) WHEN 'Gent' then weight else 0 END) as [Gent],
sum(case(plant) WHEN 'ISS' then weight else 0 END) as [ISS],
sum(case(plant) WHEN 'Ger' then weight else 0 END) as [Ger],
SUM(weight) as total
from MEPDARPD.dbo.rous group by datum
with rollup

这个查询解决了我的问题。谢谢你的帮助。

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

https://stackoverflow.com/questions/47375963

复制
相关文章

相似问题

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