#sql
Есть простенький запрос, неважно на каких данных select item, count(*) from table group by item Задание: "перевернуть" вывод, т.е. строки сделать столбцами.
Ответы
Ответ 1
При условии, что нам известны все возможные варианты Items, например 'Keyboard', 'Mouse' и 'Printer': select sum(case Item when 'Keyboard' then 1 else 0 end) as Keyboard, sum(case Item when 'Mouse' then 1 else 0 end) as Mouse, sum(case Item when 'Printer' then 1 else 0 end) as Printer from [table] UPD1. Чуток почесав голову становится ясно, как повторить то же самое для произвольного неизвестного нам набора item-ов (но тип-то хотя бы знать надо). declare @query varchar(MAX), @item varchar(50) declare cur cursor for select distinct item from [table] open cur set @query = 'select ' fetch cur into @item while @@fetch_status = 0 begin set @query = @query + 'sum(case Item when ''' + @item + ''' then 1 else 0 end) as ' + @item + ',' fetch cur into @item end set @query = LEFT(@query, LEN(@query) - 1) + ' from [table]' execute(@query) close cur deallocate cur UPD2. @minamoto дело говорит, жульничать плохо. Более достоверный вариант. declare @query1 varchar(MAX), @query2 varchar(MAX), @item varchar(50), @i int declare cur cursor for select distinct item from [table] open cur set @query1 = 'select ' set @query2 = 'select ' set @i = 0 fetch cur into @item while @@fetch_status = 0 begin set @query1 = @query1 + '''' + @item + ''' as col' + Cast(@i as varchar(50)) + ',' set @query2 = @query2 + 'cast(sum(case Item when ''' + @item + ''' then 1 else 0 end) as varchar(50)),' set @i = @i + 1 fetch cur into @item end set @query1 = LEFT(@query1, LEN(@query1) - 1) set @query2 = LEFT(@query2, LEN(@query2) - 1) + ' from [table]' execute(@query1 + ' UNION ' + @query2 + ' order by col1 desc') close cur deallocate cur ЗЫ. написано на T-SQL, если что. проверено на MSSQL 2005Ответ 2
Я в таких ситуациях обычно использую PIVOT. Как им пользоваться доходчиво написано тут Названия столбцов "перевернутой" таблицы, правда я делал через динамический SQL(что не очень красиво), но работало.
Комментариев нет:
Отправить комментарий