2017-01-04 8 views
1

В SQL (SQLite) У меня есть таблица «вес», содержащая вес по размеру элемента, например.SQL pivot и заполните значения NULL

item size weight 
---- ---- ------ 
a small  1.2 
a medium 2.2 
b medium 1.6 
c small  1.0 
c medium 1.5 
c large  2.0 

Как можно повернуть стол так, у меня есть столбец «элемент» с одной строкой на каждом уникальное значение, то есть столбцы для каждого значения, которое отображается в «размере». Если вес отсутствует для заданного размера элемента, вместо него вводится значение NULL.

item small medium large 
---- ----- ------ ----- 
a 1.2 2.2 NULL 
b NULL 1.6 NULL 
c 1.0 1.5 2.0 

ответ

1
Select item 
     ,max(case when size='small' then weight else null end) as small 
     ,max(case when size='medium' then weight else null end) as medium 
     ,max(case when size='large' then weight else null end) as large 
From weights 
Group By item 

EDIT - Динамическая версия

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([size]) From YourTable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [Item],' + @SQL + ' 
From YourTable 
Pivot (max(weight) For [size] in (' + @SQL + ')) p' 
Exec(@SQL); 

Примечание: Я не использовал SQLite в годах. Не уверен, что этот динамический подход будет работать

+0

Выглядит хорошо! Как мне это сделать, если я не знаю, какие значения будут в столбце «размер»? (Как в настоящее время вы их жестко закодировали) – user7343733

+0

@ user7343733 См. EDIT - Динамическая версия –

1

NULL является результатом CASE, когда условие не выполняется.

Select  item 
      ,max(case when size='small' then weight end) as small 
      ,max(case when size='medium' then weight end) as medium 
      ,max(case when size='large' then weight end) as large 
From  weights 
Group By item 

или

Select  item 
      ,max(case size when 'small' then weight end) as small 
      ,max(case size when 'medium' then weight end) as medium 
      ,max(case size when 'large' then weight end) as large 
From  weights 
Group By item 

 Смежные вопросы

  • Нет связанных вопросов^_^