Перейти к содержимому

Как транспонировать в sql

  • автор:

Как транспонировать несколько столбцов в несколько строк?

Сложно сформулировать, покажу на примере.
В таблице несколько полей с датами и им соответствуют поля со значениями, но мне не нужно, чтобы для каждого типа значений(val1, val2 и тд) были отдельные столбцы в выгрузке, мне нужно, чтобы был один столбец с названием значения и один со значениями, поэтому, я написал запрос:

select val1_date as date, 'val1' as val_name, count(val1) as value from . group by 1,2 union select val2_date as date, 'val2' as val_name, count(val2) as value from . group by 1,2

5dea09e67da2c961873816.png

Получаем соответственно:

А вопрос собственно в том, как это написать нормально, без использования юнион, одним запросом.

  • Вопрос задан более трёх лет назад
  • 1412 просмотров

4 комментария

Простой 4 комментария

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

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

Отслеживать
задан 31 июл 2015 в 9:45
659 1 1 золотой знак 7 7 серебряных знаков 20 20 бронзовых знаков
Подозреваю, что это гораздо труднее, чем кажется с первым взглядом.
31 июл 2015 в 9:50
используете mysql?
31 июл 2015 в 9:57

Тестовое задание на позицию Junior Developer. Видимо подразумевается независимость от субд. Остальные задачи были простыми. Я использую Firebird и MS.

31 июл 2015 в 9:57
31 июл 2015 в 10:17
Сейчас попробую
31 июл 2015 в 10:26

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

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

Отслеживать
ответ дан 31 июл 2015 в 11:02
11.5k 16 16 серебряных знаков 16 16 бронзовых знаков

при помощи интернета и какой-то. получилось такое. Это только для 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 

Отслеживать
ответ дан 31 июл 2015 в 10:41
16.4k 2 2 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака
да, group_concat в ms sql нету. Читал про него когда гуглил решение.
31 июл 2015 в 10:55

Не претендую на изящность решения, но вот вариант с курсором:

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 

Частичное транспонирование таблицы

Добрый день.
подскажите как можно решить данную проблему:

по тех заданию бывшего сотрудника ДИТ сделал нам сводную таблицу всех заявок менеджеров, но в странном для меня формате, а именно:
визуально выглядит как будто часть таблицы размещена перпендикулярно и в итоге select-ом по ID я получаю огромный набор строк

id date столбец1 столбец2
1 03.03.2022 фио иванов сергей
1 03.03.2022 проверил ББ
1 03.03.2022 дата монтажа 04.03.2022
1 03.03.2022 поставщик ООО АМАР

возможно ли развернуть часть таблицы или вывести данные каким то другим способом в строку?

сейчас с помощь where по Столбцам , я могу получить только одно значение

1 03.03.2022 фио иванов сергей

а для анализа хочется видеть данные вот так:

id date фио проверил дата монтажа поставщик
1 03.03.2022 иванов сергей ББ 04.03.2022 ООО АМАР

заранее спасибо за любую консультацию.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Транспонирование нескольких строк/столбцов таблицы при использовании динамического SQL
Доброго времени суток! Просьба помочь с написанием скрипта для транспонирования таблицы с.

Частичное транспонирование таблицы
Доброго времени суток, форумчане! Имеется таблица с ID товаров и таблица со значением свойств.

Транспонирование таблицы
Есть внешний отчет, который выдает следующий результат. Нужно преобразовать таблицу(провести.

Транспонирование таблицы БД
Дана известная таблица в БД, размера 3 на 3. Транспонировать её (поменять местами столбцы и строки).

Транспонирование таблицы
Добрый день! Имеется таблица в неудобном виде: Наименование Булка Склад школы 3 Склад.

Регистрация: 21.03.2022
Сообщений: 40

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
CREATE TABLE #tt ( id INT , date_ DATE, s1 VARCHAR(50) , s2 VARCHAR(50), ) INSERT #tt (id,date_,s1,s2) VALUES( 1,'20220303','фио','иванов сергей'), (1,'20220303','проверил','ББ'), (1,'20220303','дата монтажа','04.03.2022'), (1,'20220303','поставщик','ООО АМАР') SELECT id,date_, (SELECT s2 FROM #tt t2 WHERE t2.s1 = 'фио' AND t1.id = t2.id AND t1.date_ = t2.date_ ) AS 'фио', (SELECT s2 FROM #tt t3 WHERE t3.s1 = 'проверил' AND t1.id = t3.id AND t1.date_ = t3.date_ ) AS 'проверил', (SELECT s2 FROM #tt t4 WHERE t4.s1 = 'дата монтажа' AND t1.id = t4.id AND t1.date_ = t4.date_ ) AS 'дата монтажа', (SELECT s2 FROM #tt t5 WHERE t5.s1 = 'поставщик' AND t1.id = t5.id AND t1.date_ = t5.date_ ) AS 'поставщик' FROM #tt t1 GROUP BY id,date_

Регистрация: 14.09.2015
Сообщений: 104

спасибо за идею.
ограничился одним запросом с вложенными подзапросами

1 2 3 4 5 6
SELECT top (1) id,date_, (SELECT [столбец1] FROM table1 WHERE [столбец1] = 'фио' AND Id = 1 ) AS 'фио', (SELECT [столбец1] FROM table1 WHERE [столбец1] = 'проверил' AND Id = 1 ) AS 'проверил', (SELECT [столбец1] FROM table1 WHERE [столбец1] = 'дата монтажа' AND Id = 1 ) AS 'дата монтажа', (SELECT [столбец1] FROM table1 WHERE [столбец1] = 'поставщик' AND Id = 1) AS 'поставщик' FROM table1

Транспонирование запроса в T-SQL

select zz.fio, MAX(st1) stat1, MAX(st2) stat2, MAX(st3) stat3
from
(select fio,
case when STAT=’Stat1′ then kolvo else NULL END as st1,
case when STAT=’Stat2′ then kolvo else NULL END as st2,
case when STAT=’Stat3′ then kolvo else NULL END as st3
from
(
select fio, STAT, COUNT(*) kolvo
from dbo.Table_3
group by fio, stat
) z
) zz
group by fio

Решение 2 (сжали до двух ходов):

WITH fioStat(fio, stat, kolvo) as (
select fio, STAT, COUNT(*) kolvo
from dbo.Table_3
group by fio, stat
)
SELECT fio,
max(case when STAT=’Stat1′ then kolvo else NULL END) as st1,
max(case when STAT=’Stat2′ then kolvo else NULL END) as st2,
max(case when STAT=’Stat3′ then kolvo else NULL END) as st3
from fioStat
group by fio

Решение 3 (с подсчетом сумм):

WITH fioStat(fio, stat, kolvo) as (
select fio, STAT, COUNT(*) kolvo
from dbo.Table_3
group by fio, stat
)
SELECT fio,
max(case when STAT=’Stat1′ then kolvo else NULL END) as st1,
max(case when STAT=’Stat2′ then kolvo else NULL END) as st2,
max(case when STAT=’Stat3′ then kolvo else NULL END) as st3
from fioStat
group by fio
union
select ‘Total:’,
sum(case when STAT=’Stat1′ then kolvo else NULL END) as st1,
sum(case when STAT=’Stat2′ then kolvo else NULL END) as st2,
sum(case when STAT=’Stat3′ then kolvo else NULL END) as st3
from fioStat

fio st1 st2 st3
Den 3 2 1
Paul 4 2 2
Total: 7 4 3

* Работает для заранее известного числа столбцов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *