Вы можете group by
Дата:
SELECT Date
, max(case when vt.name = 'foo' then v.value end) as Foo
, max(case when vt.name = 'bar' then v.value end) as Bar
FROM Values v
LEFT JOIN
value_type vt
ON vt.value_id = v.id
group by
Date
Кстати, внешний ключ кажется необычным.Я бы ожидал столбец value_type
в таблице values
, а не столбец value_id
в таблице values_type
!Значений гораздо больше, чем типов значений, верно?
РЕДАКТИРОВАТЬ: В SQL нет способа генерировать переменное число столбцов, поэтому вам придется прибегнуть к мета-SQL или динамическому SQL.Вот пример:
create table [values] (id int, date datetime, value float)
insert [values] values (1, '2010-01-01', 1.0)
insert [values] values (2, '2010-01-01', 2.0)
insert [values] values (3, '2010-01-02', 4.0)
insert [values] values (4, '2010-01-03', 5.0)
create table value_types (value_id int, name varchar(max))
insert value_types values (1,'foo'), (2,'bar'), (3,'bar'), (4,'foo')
declare @sql varchar(max)
set @sql = ''
select @sql = @sql + ', max(case when vt.name = ''' +
name + ''' then v.value end) as ' + name + CHAR(13) + CHAR(10)
from value_types
group by
name
set @sql = 'SELECT Date
' + @sql +
'FROM [values] v
LEFT JOIN
value_types vt
ON vt.value_id = v.id
group by
Date'
exec (@sql)
Это печатает:
Date bar foo
----------- ------- -------
2010-01-01 2 1
2010-01-02 4 NULL
2010-01-03 NULL 5