Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразование результата выборки  [new]
yesnoms
Member

Откуда:
Сообщений: 21
Добрый вечер. Возникла необходимость в преобразовании одного SQL запроса в другой вид.
В общем, структура базы не позволяет выгрузить информацию так, как мне нужно. Потому приходится извращаться.

Система хранит карточки клиентов. В отдельной таблице хранится основная инфо о карточке (дата создания, айди пользователя, айди карточки). Но, чтобы достать значения карточек, нужно сделать джойн еще с некоторыми таблицами.
Каждая карточка имеет поля. У поля есть имя и его значение. Имя поля и его значение хранятся по разным таблицам в виде данных в таблице. А нужно преобразовать запрос так, чтобы имя поля было именем столбца, а под ним его значение. В общем, чтобы запрос был похож на екселевскую таблицу.

Ниже сам запрос:

SELECT
	cd.id,
	cd.create_date,
	cd.phone_number,
	u.username,
	ct.name,
	ISNULL(clv.keyTxt,cv.value) value
FROM card_data cd
JOIN users u on cd.create_user_id = u.id
JOIN card_values cv on cv.card_data_id = cd.id
JOIN column_type ct on ct.id = cv.columnType_id
LEFT JOIN column_list_value clv on ct.id = clv.column_type_id and cv.value = clv.valueTxt
WHERE cd.card_id = 16


Результат получаем в таком виде по одной карточке:

idcreate_datephone_numberusernamenamevalue
3874242011-11-30 10:27:47.847номер телефонаимя пользователяимя поля 1значение поля 1
3874242011-11-30 10:27:47.847номер телефонаимя пользователяимя поля 2значение поля 2
3874242011-11-30 10:27:47.847номер телефонаимя пользователяимя поля 3значение поля 3
2478352011-12-05 10:57:26.913номер телефонаимя пользователяимя поля 4значение поля 4
2478352011-12-05 10:57:26.913номер телефонаимя пользователяимя поля 5значение поля 5
2478352011-12-05 10:57:26.913номер телефонаимя пользователяимя поля 6значение поля 6


Т.е. нужно сгрупировать первые 4 поля в одну строку, а поле name растянуть горизонтально в виде имен столбцов. А значения этих столбцов будут значениями столбца value.

На выходе должно получиться так:

idcreate_datephone_numberusernameимя поля 1имя поля 2имя поля 3имя поля 4имя поля 5имя поля 6
3874242011-11-30 10:27:47.847номер телефонаимя пользователязначение поля 1значение поля 2значение поля 3значение поля 4значение поля 5значение поля 6


Смотрел в сторону PIVOT, но как понял, он работает только с агрегированными данными, и без функции сделать пайвот нельзя. именно потому он мне и не подошел..
Сервер: 2008 R2 Standart

Прошу вашей помощи :)
5 дек 11, 18:57    [11709546]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование результата выборки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @t table ( id int, create_date datetime, phone_number varchar(50), username varchar(50)
                  , name varchar(50), value varchar(50) 
                 )
insert into @t
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 1', 'значение поля 1'
union all
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 2', 'значение поля 2'
union all
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 3', 'значение поля 3'
union all
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 4', 'значение поля 4'
union all
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 5', 'значение поля 5'
union all
select '387424', '2011-11-30 10:27:47.847', 'номер телефона', 'имя пользователя', 'имя поля 6', 'значение поля 6'

select * from @t t
pivot
( max(value) for name in ([имя поля 1],[имя поля 2],[имя поля 3]
                         ,[имя поля 4],[имя поля 5],[имя поля 6] 
                         ) 
) pv
5 дек 11, 21:56    [11710065]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование результата выборки  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
yesnoms

На выходе должно получиться так:

idcreate_datephone_numberusernameимя поля 1имя поля 2имя поля 3имя поля 4имя поля 5имя поля 6
3874242011-11-30 10:27:47.847номер телефонаимя пользователязначение поля 1значение поля 2значение поля 3значение поля 4значение поля 5значение поля 6




только щас заметил, а почему так?! ведь у вас 2 разных id и create_date...почему у вас в выборке ID=387424 а не 247835!?
где логика?
5 дек 11, 21:57    [11710069]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование результата выборки  [new]
yesnoms
Member

Откуда:
Сообщений: 21
Knyazev Alexey,

вчера так и сделал. тему можно закрыть. всем спасибо :)
6 дек 11, 15:29    [11714006]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить