2016-07-22 5 views
2

В MSSQL, представьте себе, у меня есть таблица со следующими данными ...MSSQL - возвращаемые имена столбцов и значение, если значение не NULL

id name monday tuesday wednesday thursday friday 
1 mark null chores  null  gym  swim 
2 steve gym  null  class  hockey  null 
3 mike chores gym   null  null  null 

Я хотел бы иметь SQL заявление, что бы вернуть id, имя и день, где значение не является нулевым, например ...

id name day  value 
1  mark tuesday chores 
1  mark thursday gym 
1  mark friday  swim 
2  steve monday  gym 
2  steve wednesday class 
2  steve thursday hockey 
2  mike monday  chores 
2  mike tuesday gym 

Спасибо.

+1

Вы должны создать таблицу, чтобы сохранить дни недели, а затем сделать отношения между людьми - дни – Grommy

+0

выберите * от вашей таблицы, где значение равно нулю –

ответ

3

Один метод union all, но я предпочитаю outer apply:

select t.id, t.name, dayname, value 
from t outer apply 
    (values ('monday', monday), 
      ('tuesday', tuesday), 
      ('wednesday', wednesday), 
      ('thursday', thursday), 
      ('friday', friday), 
      ('saturday', saturday), 
      ('sunday', sunday) 
    ) v(dayname, value) 
where value is not null; 
+0

Сначала я попробовал это решение, и он работал точно так, как я хотел. Спасибо. – MaxAx

2

попробовать

select * from yourTable 
unpivot 
(
day1 for value in (monday, tuesday, wednesday, thursday,friday) 
) upt