chints786 Ответов: 2

Sql-запрос для преобразования значений в строке в столбец


Ниже приведено требование:
itemid	Att Name1 Att Value 1	Att Name2	Att value 2  Att Name 3 Att Val 3
4	XYZ	   A	        Color	      White           PQR       aaaaa
Как и они есть 100 плюс имя Att и значение Att в отдельных столбцах

Ниже приведен требуемый результат:
Itemid  XYZ   Color   pqr
1       A     white   aaaa

Пожалуйста помочь

Что я уже пробовал:

Стержнем может служить цели, я думаю, хотя не уверен

2 Ответов

Рейтинг:
2

CHill60

Исходя из ожидаемого результата (где значения из строки являются именами столбцов), вам действительно нужно использовать PIVOT. Однако из-за схемы таблицы вам нужно будет использовать либо UNPIVOT, либо UNION, чтобы сначала получить данные в нужную вам форму. Этот результат должен быть либо в подзапросе, либо во временной таблице, либо в общем табличном выражении.

Поскольку это домашнее задание, я не дам вам здесь полный код, но вот шаги, которые вам нужно предпринять …

1. Получить данные в формате

itemid	Attrib	AttValue
4	XYZ	A
4	Color	White
4	PQR	aaaaa
Я бы использовал оператор UNPIVOT[^] чтобы сделать это. Здесь есть отработанный пример - SQL Banana: SQL UNPIVOT на нескольких Столбцах[^]. Внимательно обратите внимание на предложение WHERE в этом примере.

Если вы не используете UNPIVOT, то вам нужно будет выбрать каждое имя атрибута по одному и объединить результаты.

2. Вы можете поместить результаты в вложенный запрос[^], ля временная таблица[^], ля табличная переменная[^] или А Общее табличное выражение (CTE)[^]. Мое личное предпочтение-CTE, но временная таблица подойдет.

3. Затем вам нужно сделать разворот (см. статью CP Простой способ использования Pivot в SQL-запросе[^] ) эти данные, чтобы получить желаемый результат.

Подсказка: Pivots всегда нуждается в какой-то кумулятивной функции в предложении PIVOT. В этом случае я бы использовал MAX().

Дайте ему попробовать, и если у вас все еще есть проблемы, ответьте кодом, который вы пробовали, и я постараюсь направить вас дальше.


Maciej Los

5ed!

chints786

Спасибо CHiLL60 и приношу извинения за поздний ответ.

Я смог получить результат с помощью unionall

Выбрать первые 1 'идентификатор элемента', [имя АТТ 1], [ФИО АТТ 2], [АТТ имя 3]
от испытаний
СОЮЗ ВСЕХ
Выберите [Itemid-значение], [значение АТТ 1], [Значение АТТ 2], [АТТ значение 3]
от испытаний

Большое спасибо за вашу помощь!!!

CHill60

Это совершенно неправильный путь к этому. Вы не выбираете "заголовки" в качестве строки данных - это выглядит нормально только в том случае, если вы вставляете результаты в Excel без заголовков столбцов. Учитывая, что многие другие студенты публиковали подобные вопросы, и тот факт, что вы сами упомянули PIVOT, должен дать вам ключ к тому, что вы провалите это задание с тем, что вы сделали.

chints786

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

Рейтинг:
0

RickZeeland

Вы можете использовать инструкцию SQL CASE, см.: Оператор SQL CASE[^]
И: CASE (Transact-SQL) - SQL Server | Microsoft Docs[^]
Для примера с ПОДСТРОКА() видеть: sql - можно ли использовать кейс...Когда внутри подстроки? - переполнение стека[^]
Вы также можете использовать Функция charindex(), видеть: Функция SQL Server CHARINDEX() [^]


chints786

как это возможно с кейсом?

RickZeeland

Вам также нужно будет использовать SUBSTRING(), я обновлю решение ...

chints786

Можете ли вы написать код и дать?

RickZeeland

Решение с UNPIVOT от CHill, вероятно, более элегантное, вы должны попробовать это в первую очередь.