首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UNPIVOT返回数据类型

UNPIVOT返回数据类型
EN

Stack Overflow用户
提问于 2016-08-31 05:25:43
回答 1查看 635关注 0票数 2

我正在使用UNPIVOT运算符,并且返回了一个不需要的数据类型。查询将为未透视的数据返回nvarchar数据类型。当连接到一个具有varchar数据类型的表时,我得到了一个隐式类型转换。下面是将产生这些结果的示例。

有没有办法控制UNPIVOT返回的输出数据类型?我想让UNPIVOT返回varchar数据类型。

代码语言:javascript
复制
CREATE TABLE #Data
(
    Facility varchar(10) NOT NULL,
    Dt datetime NOT NULL,
    VolumeType1 int NOT NULL,
    VolumeType2 int NOT NULL,
    VolumeType3 int NOT NULL
);

CREATE TABLE #Map
(
    Facility varchar(10) NOT NULL,
    Department varchar(15) NOT NULL,
    VolumeType varchar(15) NOT NULL
)

INSERT INTO #Data VALUES
('Building1', '08/01/2016', 2500, 2500, 30),
('Building1', '08/02/2016', 3000, 3000, 35),
('Building2', '08/01/2016', 2500, 2500, 30),
('Building2', '08/02/2016', 3000, 3000, 35)

INSERT INTO #Map VALUES
('Building1', 'Department1', 'VolumeType1'),
('Building1', 'Department2', 'VolumeType2'),
('Building2', 'Department3', 'VolumeType1')

SELECT
    *
FROM 
    #Data
    UNPIVOT
        (
            Volume FOR VolumeType IN (VolumeType1, VolumeType2, VolumeType3) 
        ) AS UNP
    JOIN #Map
        ON UNP.Facility = #Map.Facility
            AND UNP.VolumeType = #Map.VolumeType
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 06:14:12

UNPIVOT函数有点奇怪,因为它将从不同的列(具有相同的数据类型和长度)获取数据,并将其转换为行。

虽然它转换了数据,但在此过程中似乎确实做了一些假设。例如,您的Volume列的数据类型为int,因为这是您取消透视的每个列的数据类型,但问题出在您的VolumeType列-引擎不知道您的数据是varchar还是nvarchar,所以当您执行取消透视时,它会提供nvarchar(256)

如果您不想进行隐式类型转换,那么我建议您使用CROSS APPLY来取消数据透视。这只需要几行代码,但如果需要,您可以包含显式数据类型。下面是一个示例:

代码语言:javascript
复制
select *
from
(
    select Facility, Dt, VolumeType, Volume
    from #Data
    cross apply
    (
        select 'VolumeType1', VolumeType1 union all
        select 'VolumeType2', VolumeType2 union all
        select 'VolumeType3', VolumeType3
    ) c (VolumeType, Volume)
) UNP
JOIN #Map
        ON UNP.Facility = #Map.Facility
            AND UNP.VolumeType = #Map.VolumeType;

See Demo。这应该会删除隐式转换,但是如果没有,那么您可以在CROSS APPLY内部执行转换

代码语言:javascript
复制
select *
from
(
    select Facility, Dt, VolumeType, Volume
    from #Data
    cross apply
    (
        select cast('VolumeType1' as varchar(15)), VolumeType1 union all
        select cast('VolumeType2' as varchar(15)), VolumeType2 union all
        select cast('VolumeType3' as varchar(15)), VolumeType3
    ) c (VolumeType, Volume)
) UNP
JOIN #Map
        ON UNP.Facility = #Map.Facility
            AND UNP.VolumeType = #Map.VolumeType;     

See Demo

你的问题与我在DBA.SE上发布的为什么UNPIVOT要求所有数据类型长度相同的问题非常相似。

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

https://stackoverflow.com/questions/39237329

复制
相关文章

相似问题

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