【问题标题】:MS SQL Server. Transpose columns of data to rows of data微软 SQL 服务器。将数据列转置为数据行
【发布时间】:2019-04-08 22:12:54
【问题描述】:

我有一个详细信息表,可以通过以下方式描述:

Create table #Details (
Id int identity,
HeaderId int,
ChannelId int,
Value float
)

我们插入一些种子数据:

insert into #Details (HeaderId, ChannelId, Value) values(1, 0, 1019.51)
insert into #Details (HeaderId, ChannelId, Value) values(1, 1, 20.1)
insert into #Details (HeaderId, ChannelId, Value) values(1, 2, 21.2)
insert into #Details (HeaderId, ChannelId, Value) values(1, 3, 22.3)
insert into #Details (HeaderId, ChannelId, Value) values(1, 4, 23.4)

insert into #Details (HeaderId, ChannelId, Value) values(2, 0, 1020.62)
insert into #Details (HeaderId, ChannelId, Value) values(2, 1, 26.1)
insert into #Details (HeaderId, ChannelId, Value) values(2, 2, 27.2)
insert into #Details (HeaderId, ChannelId, Value) values(2, 3, 28.3)
insert into #Details (HeaderId, ChannelId, Value) values(2, 4, 29.4)

全选产生以下结果:

我想将列数据转置为行,以产生以下输出:

提前致谢。

【问题讨论】:

  • 哪个数据库? Channelld 是否仅包含 0,1,2,3,4 个值,还是您可以拥有更多?如果没有,您可以在 SQL Server 中使用 PIVOT。
  • SQL 服务器。我以为你可以使用 pivot ,但我没有得到正确的查询。因此在这里提出问题。谢谢。
  • 如果您知道0,1,2,3,4 的值将提前在枢轴中使用,那么一个普通的旧pivot 是要走的路。如果您在运行 sql 之前不知道列标题的值是什么,那么您需要执行 Dynamic Pivot。您必须让我们知道哪种方案适合此处以获得正确答案,因为解决方案会有所不同。

标签: sql sql-server tsql pivot


【解决方案1】:

给你。只需在子查询中选择第一个 HeaderId,value, ChannelId,然后旋转即可。

DECLARE @tbl TABLE (Id int identity,
HeaderId int,
ChannelId int,
Value float)

insert into @tbl (HeaderId, ChannelId, Value) values(1, 0, 1019.51)
insert into @tbl (HeaderId, ChannelId, Value) values(1, 1, 20.1)
insert into @tbl (HeaderId, ChannelId, Value) values(1, 2, 21.2)
insert into @tbl (HeaderId, ChannelId, Value) values(1, 3, 22.3)
insert into @tbl (HeaderId, ChannelId, Value) values(1, 4, 23.4)

insert into @tbl (HeaderId, ChannelId, Value) values(2, 0, 1020.62)
insert into @tbl (HeaderId, ChannelId, Value) values(2, 1, 26.1)
insert into @tbl (HeaderId, ChannelId, Value) values(2, 2, 27.2)
insert into @tbl (HeaderId, ChannelId, Value) values(2, 3, 28.3)
insert into @tbl (HeaderId, ChannelId, Value) values(2, 4, 29.4)

SELECT * 
FROM
    (
    SELECT HeaderId,value, ChannelId
        FROM
    @tbl
    )T
PIVOT
    (
        SUM(value)

        FOR ChannelId IN ([0],[1], [2], [3], [4]

    )
) AS PivotTable;

结果如下:

【讨论】:

  • 谢谢!我错过了查询中的 HeaderId!
【解决方案2】:

这应该可行:

select HeaderId
  , [0] as ChannelId0
  , [1] as ChannelId1
  , [2] as ChannelId2
    , [3] as ChannelId3
      , [4] as ChannelId4
from
(
  select HeaderId, ChannelId,Value
  from #Details
) x
pivot
(
  max(Value)
  for ChannelId in([0],[1],[2], [3],[4],[5])
)p

【讨论】:

  • 谢谢!我错过了查询中的 HeaderId!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多