【问题标题】:SQL Pivot returns null values when pivoting (n)varchar data透视 (n)varchar 数据时,SQL Pivot 返回空值
【发布时间】:2015-01-29 17:36:52
【问题描述】:

我正在努力在 Microsoft SQL Server 2012 中对数据进行透视。当我尝试使用 varchar 值执行透视时,脚本会为所有记录返回 NULL 值。我的代码如下所示:

select [Identifier], [Geography Description], [Temperature Description], [Humidity Description], [Pressure Description]
from 
    (
        select [Identifier], [AttributeID], [AttributeValue]
            from [dbo].[StringAttributeValues]
    ) as A

PIVOT

(
    max(AttributeID)
    for [AttributeValue] in ([Geography Description], [Temperature Description], [Humidity Description], [Pressure Description])
) as B

然后我遵循了这个thread 的最高答案的建议并修改了我的脚本。最终结果是我的脚本仍然为所有列中的每条记录返回 NULL 值。

select [Identifier], [1] as [Geography Description], [2] as [Temperature Description], [3] as [Humidity Description], [4] as [Pressure Description]
from 
    (
        select [Identifier], [AttributeID], [AttributeValue]
            from [dbo].[StringAttributeValues]
    ) as A

PIVOT

(
    max(AttributeID)
    for [AttributeValue] in ([1], [2], [3], [4])
) as B

这是一些详细说明我的表结构和一些示例值的代码:

    create table [dbo].[StringAttributeValues]
(
    [Identifier] int
    ,[AttributeID] int
    ,[AttributeValue] nvarchar(15)
)

insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (1, 1, 'Mountains')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (2, 1, 'Coast')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (3, 1, 'Desert')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (4, 1, 'Jungle')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (5, 1, 'Plains')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (1, 2, 'Cold')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (2, 2, 'Warm')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (3, 2, 'Hot')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (4, 2, 'Hot')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (5, 2, 'Hot')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (1, 3, 'Dry')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (2, 3, 'Humid')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (3, 3, 'Dry')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (4, 3, 'Humid')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (5, 3, 'Dry')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (1, 4, 'High')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (2, 4, 'Low')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (3, 4, 'High')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (4, 4, 'Low')
insert into dbo.StringAttributeValues ([Identifier], [AttributeID], [AttributeValue]) values (5, 4, 'Low')

任何人都可以向我提供一些关于为什么会发生这种情况以及我如何解决它的见解吗?

(在 MATLAB、C#、Python 等语言中,这是一个非常简单的程序)

提前谢谢你。

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    这只是 PIVOT 子句中列的错位。 试试这个:

    SELECT [Identifier], [1] as [Geography], [2] as [Temperature], [3] as [Humidity], [4] as [Pressure]
    FROM
        (
            SELECT [Identifier], [AttributeID], [AttributeValue]
            FROM dbo.StringAttributeValues
        ) as A
    
    PIVOT
    (
        max(AttributeValue)
        for AttributeID in ([1], [2], [3], [4])
    ) as B
    

    【讨论】:

      【解决方案2】:
      select [Identifier], [1] as [Geography Description], [2] as [Temperature Description], [3] as [Humidity Description], [4] as [Pressure Description]
      from 
          (
              select [Identifier], [AttributeID], [AttributeValue]
      
                  from [dbo].[StringAttributeValues]
          ) as x
      
      PIVOT
      
      (
          max([AttributeValue])
          for [AttributeID] in ([1], [2], [3], [4])
      ) as piv
      

      FIDDLE

      【讨论】:

      • 不是我的 DV,而是 row_number() 在这里没有做任何事情。他们查询的问题是他们的查询存在语法问题,导致 null。
      • 您添加了col,但您实际上并没有将它用于任何用途,它可以被删除 - sqlfiddle.com/#!6/231aa/4。他们拥有解决数据问题所需的一切,他们查询的问题是他们将attributeIdattributevalue 颠倒了。
      猜你喜欢
      • 2010-12-16
      • 2017-06-04
      • 2019-02-07
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2015-01-26
      • 2010-11-04
      • 1970-01-01
      相关资源
      最近更新 更多