1

我有一个带有句点和三列的查询,它们是不同的数据类型。

abc: int
def: decimal
hij: int

这三列提供的数据来自不同的查询。

这是当前结果

Period    abc   def   hij
------    ----  ----  ---
2012-01    10   0.00    4
2012-02     5   0.00    5
2012-03     0   2.40    8

我想得到以下输出

abc 2012-01 10 0.00
abc 2012-02  5 0.00
abc 2012-03  0 0.00
def 2012-01  0 0.00
def 2012-02  0 0.00
def 2012-03  0 2.40
hij 2012-01  4 0.00
hij 2012-02  5 0.00
hij 2012-03  8 0.00

我想使用 unpivot,但它给了我一个冲突类型的错误。

4

2 回答 2

4

您得到的错误是因为您在 UNPIVOT 中将小数与 int 混合在一起。

看起来您想要 UNPIVOT 但随后def又从其他列中分离出来。

我能够实现看起来像这样的预期结果:

declare @t table(Period varchar(10), abc int, def decimal(5,2), hij int)
insert into @t values ('2012-01',10,0.00,4)
, ('2012-02',5,0.00,5)
, ('2012-03',0,2.40,8);

with a as (
    select cols, Period, val
    from (select Period, abc=CAST(abc as decimal(5,2)), def, hij=CAST(hij as decimal(5,2)) from @t) p
    UNPIVOT (
        val for cols in (abc, def, hij) 
    ) as unpvt
)
select a.cols
, Period
, abc_hij=case when cols in ('abc','hij') then CAST(val as int) else 0 end
, def=case when cols = ('def') then val else 0.00 end
from a
order by cols, Period
go

结果:

在此处输入图像描述

于 2012-04-23T19:51:05.350 回答
0
与 c 作为 (
SELECT '2012-01' AS Period, 10 AS abc, 0.00 AS def, 4 AS hij
联合所有
SELECT '2012-02' AS Period, 5 AS abc, 0.00 AS def , 5 AS hij
联合所有
SELECT '2012-03' AS Period, 0 AS abc, 2.40 AS def, 8 AS hij
)
选择 * 从 (
从 c 中选择 cc.title、c.Period、cc.val
交叉申请
(
  值('abc',abc),('def',def),('hij',hij)
)抄送(标题,验证)
) 吨
ORDER BY t.title
于 2015-11-02T09:19:00.960 回答