#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
Комментариев нет:
Отправить комментарий