Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Как транспонировать результаты sql-запроса

#sql #запрос


Есть таблица T:

id    value
2      a
3      a
4      b
5      c


Необходимо сформировать запрос, который бы вернул следующий набор:

a b c
2 1 1


Если написать такой запрос:

SELECT value, Count(value)
FROM T
Group by value


то получатся результаты:

a 2
b 1
c 1


А вопрос заключается в том как этот результат повернуть, либо как написать правильный
запрос. Ковырялся с UNION и с PIVOT не получилось.
    


Ответы

Ответ 1



Используйте CASE или PIVOT. Здесь, фактически, ваш случай.

Ответ 2



при помощи интернета и какой-то... получилось такое. Это только для MySQL, как я понимаю, из-за group_concat. Но, может, чем поможет drop table if exists t1; create table t1 (id int, value char(1)); insert into t1 values (2, 'a'), (3, 'a'), (4, 'b'), (5, 'c'); select group_concat(if(v='a', c, null)) a, group_concat(if(v='b', c, null)) b, group_concat(if(v='c', c, null)) c from (select value v, Count(value) c from t1 group by value ) temp a b c 2 1 1

Ответ 3



Не претендую на изящность решения, но вот вариант с курсором: DECLARE @T2 table (id int, value char(1)) INSERT INTO @T2 values (2, 'a'), (3, 'a'), (4, 'b'), (5, 'c') DECLARE @vals varchar(10) DECLARE @cnts varchar(10) DECLARE @v char(1) DECLARE @c int DECLARE @cur cursor SET @cur = cursor local for SELECT value, COUNT(value) FROM @T2 GROUP BY value OPEN @cur FETCH NEXT FROM @cur INTO @v, @c WHILE @@FETCH_STATUS = 0 BEGIN IF @vals IS NULL SET @vals = @v ELSE SET @vals = @vals + ' ' + @v IF @cnts IS NULL SET @cnts = CAST(@c as varchar(10)) ELSE SET @cnts = @cnts + ' ' + CAST(@c as varchar(10)) FETCH NEXT FROM @cur INTO @v, @c END CLOSE @cur DEALLOCATE @cur -- ну и собственно результат: SELECT @vals SELECT @cnts

Комментариев нет:

Отправить комментарий