1

異なるデータ型の期間と 3 つの列を含むクエリがあります。

abc: int
def: decimal
hij: int

これら 3 つの列のデータは、さまざまなクエリから取得されます。

現在の結果は次のとおりです。

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

アンピボットを使用したいのですが、競合タイプのエラーが発生します。

4

2 に答える 2

4

発生しているエラーは、UNPIVOT で 10 進数と 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
WITH c AS (
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 期間、0 AS abc、2.40 AS def、8 AS hij
)
SELECT * FROM (
SELECT cc.title, c.Period,cc.val FROM c
相互適用
(
  VALUES('abc',abc),('def',def),('hij',hij)
) cc (タイトル、値)
) t
ORDER BY t.title
于 2015-11-02T09:19:00.960 に答える