Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26

Преобразование таблицы по уровням

28.02.2018, 19:27. Показов 1229. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть простая на первый взгляд задачка, имеется следующая таблица:
idf_idlvl
123422345
123522355
123622365
223442344
223532354
223632364
323552353
523562351
423452342
323652363
523462341
6234NULL0
6235NULL0
5236NULL1

Её необходимо развернуть и привести к такому виду:
543210
12342234-423452346234
123522353235-52356235
123622363236-5236-

Не могу понять, как это сделать? MS SQL 2012, метод Pivot для решения задачи не подошел. Прошу Вашей помощи.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2018, 19:27
Ответы с готовыми решениями:

Преобразование таблицы
Добрый день, Есть таблица вида: A | Text1 A | Text3 B | Text2 B | Text3 B |Text4 C | Text1

Преобразование таблицы
Привет, ребят. Нужно преобразовать таблицу из этого в это Запрос, которым я достаю первую таблицу select ...

Преобразование таблицы
Добрый день, помогите решить задачу во вложении файл экселя с помощью которого упрощался ввод информации, затем импортировался в аксцесс....

13
5970 / 4546 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
28.02.2018, 22:25
Цитата Сообщение от Wintel Посмотреть сообщение
метод Pivot для решения задачи не подошел
почему?
0
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26
28.02.2018, 22:45  [ТС]
У него на выходе получается примерно так:

Добавлено через 7 минут
543210
1234nullnullnullnullnull
1235nullnullnullnullnull
1236nullnullnullnullnull
null2234nullnullnullnull
null2235nullnullnullnull
null2236nullnullnullnull
nullnull3235nullnullnull
nullnull3236nullnullnull
nullnullnull4234nullnull
nullnullnullnull5235null
nullnullnullnull5234null
nullnullnullnull5236null
nullnullnullnullnull6234
nullnullnullnullnull6235

Т.е. лишние ячейки, нужно именно в требуемом варианте получить таблицу.
0
5970 / 4546 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
01.03.2018, 02:51
У кого - у него?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
01.03.2018, 06:41
Цитата Сообщение от Wintel Посмотреть сообщение
Её необходимо развернуть и привести к такому виду:
5 4 3 2 1 0
1234 2234 - 4234 5234 6234
1235 2235 3235 - 5235 6235
1236 2236 3236 - 5236 -
По какому принципу расставлены знаки '-' в таблице? Почему для уровня 3 '-' стоит в верхней строке, а для уровня 0 в нижней?
0
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26
01.03.2018, 09:54  [ТС]
Каждый уровень родительского id (f_id) начинается со следубщей цифры(*234, *235, *236), т.к. в столбце id отсутствует 3234, то там будет "-". Аналогично и для нижнего 6 уровня.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
01.03.2018, 12:39
Лучший ответ Сообщение было отмечено Wintel как решение

Решение

Wintel, ну тогда так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WITH MyTable AS
(
    SELECT id, f_id, lvl
        FROM (VALUES (1234, 2234, 5)
                    , (1235, 2235, 5)
                    , (1236, 2236, 5)
                    , (2234, 4234, 4)
                    , (2235, 3235, 4)
                    , (2236, 3236, 4)
                    , (3235, 5235, 3)
                    , (5235, 6235, 1)
                    , (4234, 5234, 2)
                    , (3236, 5236, 3)
                    , (5234, 6234, 1)
                    , (6234, NULL, 0)
                    , (6235, NULL, 0)
                    , (5236, NULL, 1)) T(id, f_id, lvl)
)
SELECT COALESCE([5], N'-') [5], COALESCE([4], N'-') [4], COALESCE([3], N'-') [3]
        , COALESCE([2], N'-') [2], COALESCE([1], N'-') [1], COALESCE([0], N'-') [0]
    FROM (SELECT CONVERT(NCHAR(4), id) id, lvl, STUFF(id, 1, 1, N'') Part
            FROM MyTable) T PIVOT (MAX(id) FOR lvl IN ([5], [4], [3], [2], [1], [0])) T
Заметьте, с PIVOT'ом
1
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26
01.03.2018, 22:27  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Wintel, ну тогда так:
T-SQLВыделить код

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WITH MyTable AS
(
* * SELECT id, f_id, lvl
* * * * FROM (VALUES (1234, 2234, 5)
* * * * * * * * * * , (1235, 2235, 5)
* * * * * * * * * * , (1236, 2236, 5)
* * * * * * * * * * , (2234, 4234, 4)
* * * * * * * * * * , (2235, 3235, 4)
* * * * * * * * * * , (2236, 3236, 4)
* * * * * * * * * * , (3235, 5235, 3)
* * * * * * * * * * , (5235, 6235, 1)
* * * * * * * * * * , (4234, 5234, 2)
* * * * * * * * * * , (3236, 5236, 3)
* * * * * * * * * * , (5234, 6234, 1)
* * * * * * * * * * , (6234, NULL, 0)
* * * * * * * * * * , (6235, NULL, 0)
* * * * * * * * * * , (5236, NULL, 1)) T(id, f_id, lvl)
)
SELECT COALESCE([5], N'-') [5], COALESCE([4], N'-') [4], COALESCE([3], N'-') [3]
* * * * , COALESCE([2], N'-') [2], COALESCE([1], N'-') [1], COALESCE([0], N'-') [0]
* * FROM (SELECT CONVERT(NCHAR(4), id) id, lvl, STUFF(id, 1, 1, N'') Part
* * * * * * FROM MyTable) T PIVOT (MAX(id) FOR lvl IN ([5], [4], [3], [2], [1], [0])) T
Заметьте, с PIVOT'ом
Большое спасибо, корректно работает даже если в 5-м левле у id значение NULL, правда лишняя строка появляется, но это не беда
Столкнулся с ситуацией, что в Teradata 14 отсутствует такой метод как Pivot. Есть какие-нибудь мысли по реализации этой же задачи другими методами?
0
5970 / 4546 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
01.03.2018, 22:57
Цитата Сообщение от Wintel Посмотреть сообщение
Есть какие-нибудь мысли по реализации этой же задачи другими методами?
курсором?
0
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26
01.03.2018, 23:14  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
Сообщение от Wintel
Есть какие-нибудь мысли по реализации этой же задачи другими методами?
курсором?
А если строк будет >100 000 или > 1 000 000, что по скорости выполнения, сможешь навскидку оценить?
0
5970 / 4546 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
02.03.2018, 00:03
ОЧЕНЬ долго
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
02.03.2018, 08:38
Wintel, pivot это синтаксический сахар. Если посмотрите план выполнения, то увидите, что он преобразуется в обычные агрегатные функции.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
02.03.2018, 08:58
Лучший ответ Сообщение было отмечено Wintel как решение

Решение

Цитата Сообщение от Wintel Посмотреть сообщение
Столкнулся с ситуацией, что в Teradata 14 отсутствует такой метод как Pivot. Есть какие-нибудь мысли по реализации этой же задачи другими методами?
Как уже писали выше, PIVOT - это синтаксический сахар. Без него запрос будет выглядеть примерно так:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
WITH MyTable AS
(
    SELECT id, f_id, lvl
        FROM (VALUES (1234, 2234, 5)
                    , (1235, 2235, 5)
                    , (1236, 2236, 5)
                    , (2234, 4234, 4)
                    , (2235, 3235, 4)
                    , (2236, 3236, 4)
                    , (3235, 5235, 3)
                    , (5235, 6235, 1)
                    , (4234, 5234, 2)
                    , (3236, 5236, 3)
                    , (5234, 6234, 1)
                    , (6234, NULL, 0)
                    , (6235, NULL, 0)
                    , (5236, NULL, 1)) T(id, f_id, lvl)
)
SELECT COALESCE(MAX(CASE lvl WHEN 5 THEN id END), N'-') [5]
        , COALESCE(MAX(CASE lvl WHEN 4 THEN id END), N'-') [4]
        , COALESCE(MAX(CASE lvl WHEN 3 THEN id END), N'-') [3]
        , COALESCE(MAX(CASE lvl WHEN 2 THEN id END), N'-') [4]
        , COALESCE(MAX(CASE lvl WHEN 1 THEN id END), N'-') [1]
        , COALESCE(MAX(CASE lvl WHEN 0 THEN id END), N'-') [0]
    FROM (SELECT CONVERT(NCHAR(4), id) id, lvl
            FROM MyTable) T
    GROUP BY STUFF(id, 1, 1, N'')
Цитата Сообщение от Wintel Посмотреть сообщение
если в 5-м левле у id значение NULL, правда лишняя строка появляется, но это не беда
Конечно, появится. В данном запросе строки сгруппированы по id, без учета первого символа (STUFF(id, 1, 1, N'')). Если есть стркои, где id = NULL, то в результирующем наборе будет 4 строки: для 234, для 235, для 236 и для NULL. Думаю, понимая принцип построения запроса, вы сможете без проблем переделать его под свои нужды.
1
4 / 4 / 0
Регистрация: 20.01.2016
Сообщений: 26
02.03.2018, 20:13  [ТС]
invm, сегодня как раз посмотрел.
kodv, благодарю за столь подробное разъяснение дальше я сам, ещё раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2018, 20:13
Помогаю со студенческими работами здесь

Преобразование таблицы
Подскажите:help: как можно преобразовать таблицу такого вида: №| Name A| Jei B| Ted C| Mike B| Alan B| Mark A| Daren A| Job...

Преобразование таблицы в массив
Вечер добрый. У меня есть таблица в Matchcad(7*11),как из нее можно получить матрицу? Если таблица небольшая 5*7 например,матрица...

Преобразование структуры таблицы
Доброго дня... Кто-нибудь сталкивался или знает как преобразовать таблицу на Лист1 в таблицу на Лист2 В действительности там информация...

Преобразование вида таблицы
Ведется статистика по товарам (см файл). В первой таблице список товаров. Во второй - неделя их покупки, получения, оформления и продажи....

Преобразование строки таблицы в строку
Здравствуйте! Возникла такая проблема. Имеется таблица в БД, в которой хранится информация о запущенных процессах (название, время...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru