2015-01-29 5 views
0

Скажем, у меня есть таблица со столбцом ID и несколько столбцов свойств MyTable (ID, PI, P2, P3, P4)Условный UNPIVOT в TSQL

ID P1 P2 P3 P4 
1 A1 B C1 D1 
2 C1 C2 B NULL 
3 C2 Z NULL NULL 
4 X A1 C1 NULL 

Итак, мне нужно написать запрос чтобы узнать, сколько различных значений свойств там, независимо от того, в каком столбце они находятся.

Value Count 
A1  2 
B  2 
C1  3 
C2  2 
X1  1 
... 

Я думаю, что я могу получить это с помощью UNPIVOT (поправьте меня, если я ошибаюсь)

Теперь, как я могу получить подобное количество, но группируются по количеству ненулевых значений в строке (подсчет ненулевых значений в строку может, или не может включать в себя ключевые столбцы, не имеет значения), то есть выход, как это:

Value NonNullCount Count 
A1  3   1 
A1  4   1 
B  3   1 
B  4   1 
C1  2   3 
C1  4   1 
C2  3   1 
C2  2   1 
... 

ответ

2

Вот один из методов, с помощью cross apply для UNPIVOT:

select vals.p, t.NonNullCount, count(*) 
from (select t.*, 
      ((case when p1 is not null then 1 else 0 end) + 
       (case when p2 is not null then 1 else 0 end) + 
       (case when p3 is not null then 1 else 0 end) + 
       (case when p4 is not null then 1 else 0 end) 
      ) as NonNullCount 
     from table t 
    ) t cross apply 
    (values (p1), (p2), (p3), (p4)) vals(p) 
where vals.p is not null 
group by vals.p, t.NonNullCount; 
Смежные вопросы