2014-04-23 31 views
6

içinde NULL değeri bir tabloyu açabiliyorum ancak sonuçta null değerler bulunmuyor.UNPIVOT

create table pivot_task 
(
age int null, 
[a] numeric(8,2), 
[b] numeric(8,2), 
[c] numeric(8,2), 
[d] numeric(8,2), 
[e] numeric(8,2) 
); 

select * from pivot_task; 

insert into pivot_task values (18, 0.5, null, 0.6, 1.21, 1.52), 
(19, 7.51, 6.51, 5.51, null, 3.53), 
(20, 4.52, 4.52, 6.52, 3.53, null); 


select age, [over], [av] 
from pivot_task 
unpivot 
(
[av] 
for [over] in ([a], [b], [c], [d], [e]) 
) a; 

Sen 18 yaşın [üzerinde] b ve boş değer her boş karşılaşma için de null adlı eklemek istediğiniz eksik için http://sqlfiddle.com/#!6/2ab59/1 üzerinde sonucu görebilirsiniz.

Null değerini farklı bir değerle değiştirmeyi buldum ve sonra tüm bu sabit farklı değer yaklaşımını değiştirmem işim için uygun değil. Sadece unpivot içine dahil etmek istiyorum.

+2

'18 yaş için [over]'? Bu özellikle grafik veya şiddet içeren SQL içeriyor mu? – Paul

+0

@Westie Pivot_task tablosunda, boş ve sonra başka bir ifadeyle null değerini değiştiriyorsunuz ama pivot_task kaynak tablosunu değiştiremiyorum. –

+1

Sayfanız belirtilen aralığa aitse (negatif olmayan diyor), bu sorunu geçici olarak çözebilirsiniz. İyi biçimlenmiş soru için +1. –

cevap

4

Bu çirkin ama NULL için bir çıkış bant dışı değiştirilmesini bulmak zorunda dayanmaz:

declare @pivot_task table 
(
age int null, 
[a] numeric(8,2), 
[b] numeric(8,2), 
[c] numeric(8,2), 
[d] numeric(8,2), 
[e] numeric(8,2) 
); 

insert into @pivot_task values (18, 0.5, null, 0.6, 1.21, 1.52), 
(19, 7.51, 6.51, 5.51, null, 3.53), 
(20, 4.52, 4.52, 6.52, 3.53, null); 


select a.age, pmu.[over], [av] 
from (select 'a' as [over] union all select 'b' union all select 'c' 
     union all select 'd' union all select 'e') pmu 
cross join (select age from @pivot_task) as a 
left join 
@pivot_task pt 
unpivot 
(
[av] 
for [over] in ([a], [b], [c], [d], [e]) 
) ex 
on pmu.[over] = ex.[over] and 
    a.age = ex.age 

Sonuç:

age   over av 
----------- ---- --------------------------------------- 
18   a 0.50 
18   b NULL 
18   c 0.60 
18   d 1.21 
18   e 1.52 
19   a 7.51 
19   b 6.51 
19   c 5.51 
19   d NULL 
19   e 3.53 
20   a 4.52 
20   b 4.52 
20   c 6.52 
20   d 3.53 
20   e NULL 

Ama aşağı gidiyoruz bu

select a.age, pmu.[over], 
     CASE pmu.[over] 
      WHEN 'a' THEN a.a 
      WHEN 'b' THEN a.b 
      WHEN 'c' THEN a.c 
      WHEN 'd' THEN a.d 
      WHEN 'e' THEN a.e 
     END [av] 
from (select 'a' as [over] union all select 'b' union all select 'c' 
     union all select 'd' union all select 'e') pmu 
cross join @pivot_task as a 
+0

Evet, UNPIVOT'u tamamen ortadan kaldırmak için yapılan 2. sorgu, ancak bu sorgunun nasıl işlediğini biraz açıklar mısınız? –

+1

A 'CROSS JOIN', sağdaki tablodaki her satırla soldaki tablodan her satırı eşler. Bu durumda, soldaki tablo, "a" - "e" içeren beş satırdan oluşur ve sağdaki tablo orijinal "pivot_task" tablomuzdur. Böylece 'a' - 'e ',' 19 'sırasının her biri ile eşleştirilen 18'lerin sırası ile sona ereriz,' a '-' e 'ile ... Daha sonra' CASE 'ifadesinde, Sadece "pivot_task" satırının şu anda eşleştirildiği mektuba uygun olan sütunu seçiyoruz. –

3

bu deneyin, yerini alacak bir: rota, UNPIVOT tamamen ortadan kaldırabilir null değerlerini 10000000 ile unpivottan önce nümerik (8,2) olarak kabul edilebilir bir sayı değil, böylece değer zaten mevcut olmayacaktır. Sonra değer UNPIVOT sonra boş yerini alacaktır:

;WITH x as 
(
select 
age, 
coalesce(cast(a as numeric(9,2)), 10000000) a, 
coalesce(cast(b as numeric(9,2)), 10000000) b, 
coalesce(cast(c as numeric(9,2)), 10000000) c, 
coalesce(cast(d as numeric(9,2)), 10000000) d, 
coalesce(cast(e as numeric(9,2)), 10000000) e 
from pivot_task 
) 
select age, [over], nullif([av], 10000000) av 
from x 
unpivot 
(
[av] 
for [over] in ([a], [b], [c], [d], [e]) 
) a; 
1

KULLANIMI ISNULL (columnname, 0) UNPIVOT BT ÖNCE TÜM COLUMN İÇİN http://technet.microsoft.com/en-us/library/ms184325.aspx. Aşağıdaki gibi

.

Select Age, Data, Case When (Value = 0) Then NULL Else Value End Value 
from (
select age, 
    ISNULL([a],0)[a], ISNULL([b],0)[b], ISNULL([c],0)[c], ISNULL([d],0)[d], ISNULL([e],0)[e] 
From pivot_task) As pvttask 
UnPivot ([Value] for [Data] In ([a], [b], [c], [d], [e])) a 
+0

bu temelde @VigneshKumar tarafından gönderilen ile aynı cevap değil mi? –