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

Откуда:
Сообщений: 87
Коллеги добрый день,

Подскажите как мне правильно сформировать запрос с использованием оператора pivot

У меня есть запрос типа

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '{название таблицы}' and COLUMN_NAME NOT IN ('id')



при его выполнении мы получаем вертикальную портянку в виде название столбцов из этой таблице

Вопрос: Как мне её развернуть и сделать горизонтальной?

Есть такой оператор PIVOT, пытался им сделать но все безуспешно
4 июл 13, 16:28    [14523420]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimonchik,

Вы хотите получить результат запроса с заранее неизвестным количеством столбцов?
4 июл 13, 16:34    [14523468]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
if OBJECT_ID('tempdb..#temp','U') is not null
	drop table #temp
create table #temp(date datetime,category varchar(10),amount numeric (22,2))	

insert into #temp values ('20120101', 'ABC', 1000.00) insert into #temp values ('20120102', 'DEF', 500.00) insert into #temp values ('20120102', 'GHI', 800.00) insert into #temp values ('20120210', 'DEF', 700.00) insert into #temp values ('20120103', 'ABC', 1100.00)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM #temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT date, ' + @cols + ' from 
            (
                select date
                    , amount
                    , category
                from #temp
           ) x
            pivot 
            (
                 max(amount)
                for category in (' + @cols + ')
            ) p '


execute(@query)

drop table #temp
4 июл 13, 16:34    [14523469]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Гость333
Dimonchik,

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


Да
4 июл 13, 16:42    [14523531]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Одним из ответов на ваш вопрос - не делать сего извращения на SQL. Сделайте это на клиенте - эффективнее.
4 июл 13, 16:46    [14523548]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Да я хочу развернуть запрос, что бы легче было вносить данные из одной таблицы в другую, не зная предварительно при этом название столбцов

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'client' and COLUMN_NAME NOT IN ('id')

на выходе

ClientUser0
ClientUser1
ClientUser2
Sex
BirthDay
BirthPlace

и так далее


нужно получить

select ClientUser0,ClientUser1,ClientUser2,Sex,BirthDay,BirthPlace .... from dbo.client
4 июл 13, 16:47    [14523554]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Вы таки ответите на вопрос - зачем это делать на SQL?
4 июл 13, 16:52    [14523586]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Mnior,

Мне подумал, что так будет проще
4 июл 13, 16:55    [14523605]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Dimonchik,

точнее я подумал, что так будет проще
4 июл 13, 16:55    [14523609]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Мистер Хенки,

Спасибо, у меня получилось
4 июл 13, 17:21    [14523773]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimonchik
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'client' and COLUMN_NAME NOT IN ('id')

Не вдаваясь в подробности задачи, замечания только по этому запросу.
1) по одному TABLE_NAME нельзя однозначно определить объект в базе. Уникальной является комбинация TABLE_SCHEMA + TABLE_NAME. В разных схемах могут существовать объекты с одинаковым именем, например dbo.client и test_schema.client.
2) если вы хотите отсеять identity-столбцы, то это делается не так "COLUMN_NAME NOT IN ('id')", а примерно так:
COLUMNPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + N'.' + QUOTENAME(TABLE_NAME)), COLUMN_NAME, 'IsIdentity') = 0
4 июл 13, 17:28    [14523815]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Dimonchik
на выходе

ClientUser0
ClientUser1
ClientUser2
Sex
BirthDay
BirthPlace

и так далее

нужно получить

select ClientUser0,ClientUser1,ClientUser2,Sex,BirthDay,BirthPlace .... from dbo.client

То есть по факту никакого PIVOT тут не нужно? Нужна генерация строки для динамического SQL?
FAQ: Сложение символьных полей в запросе, Сложение символьных полей в запросе для SQL Server 2005
4 июл 13, 17:31    [14523833]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сформировать запрос с оператором pivot ?  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Гость333,

Да совершенно верно.
Всем спасибо
4 июл 13, 17:46    [14523911]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить