【问题标题】:How to set rows value as column in SQL Server?如何在 SQL Server 中将行值设置为列?
【发布时间】:2017-10-30 21:37:16
【问题描述】:

我有一张表tblTags(日期、标签索引、值)

表中的值为:

Date            Tagindex    Value
---------------------------------
2017-10-21         0          21
2017-10-21         1         212
2017-10-21         2          23
2017-10-21         0          34
2017-10-21         1          52
2017-10-21         2          65

我希望结果为:

Date            0    1     2
-------------------------------
2017-10-21      21   212   23
2017-10-21      34    52   65

为此,我编写了以下查询

select * 
from
    (SELECT a.Date, a.Tagindex,a.value
     FROM tblTag a) as p
pivot 
    (max(value)
        for Tagindex in ( [tblTag])
    ) as pvt

但我收到以下错误:

消息 8114,第 16 级,状态 1,第 10 行
将数据类型 nvarchar 转换为 int 时出错。

消息 473,第 16 级,状态 1,第 10 行
PIVOT 运算符中提供了不正确的值“tblTag”。

如何解决这个问题。

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    我认为可以使用这样的查询:

    ;with t as (
      select *
        , row_number() over (partition by [Date],[Tagindex] order by (select 0)) seq
      from tblTag
    )
    select [Date],
      max(case when [Tagindex] = 0 then [Value] end) '0',
      max(case when [Tagindex] = 1 then [Value] end) '1',
      max(case when [Tagindex] = 2 then [Value] end) '2'
    from t
    group by [Date], seq;
    

    SQL Server Fiddle Demo
    SQL Server Fiddle Demo - with pivot

    注意:在上面的查询中,我使用row_number() 函数为每个DateTagindex 创建一个序列号,但诀窍在于使用(select 0) 这是一个按部分顺序使用的临时字段,将不信任返回插入行的任意顺序。因此,如果您需要实现受信任的结果集;您需要有一个额外的字段,例如 datetime 或自动增量字段。

    【讨论】:

      【解决方案2】:

      试试这个:

      DECLARE @tblTag TABLE
      (
          [Date] DATE
         ,[TagIndex] TINYINT
         ,[Value] INT
      );
      
      INSERT INTO @tblTag ([Date], [TagIndex], [Value])
      VALUES ('2017-10-21', 0, 21)
            ,('2017-10-21', 1, 212)
            ,('2017-10-21', 2, 23)
            ,('2017-10-22', 0, 34)
            ,('2017-10-22', 1, 52)
            ,('2017-10-22', 2, 65);
      
      SELECT *
      FROM @tblTag
      PIVOT
      (
          MAX([value]) FOR [Tagindex] IN ([0], [1], [2]) 
      ) PVT;
      

      你需要准确地说which are the PIVOT columns。如果您要为 TagIndex 设置不同的值并且您无法对它们进行硬编码,则需要使用动态 PIVOT。

      此外,您需要确保有一种方法可以将 tagIndex 值分组到一行中。例如,不同的日期(如在我的测试数据中),ID 列标记何时插入行或其他内容(组 ID 列或添加日期列)。

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 2013-12-05
        相关资源
        最近更新 更多