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

Откуда:
Сообщений: 62
Доброго времени суток!
Подскажите как сформировать запрос к таблице БАЛАНС, у которой поля: статьи баланса, ид, период, чтобы периоды стали наименованиями столбцов и выглядело:

статьи| 01.01.2013| 01.02.2013| 01.03.2013|
активы| 20000000 | 210000000| 220000000|
пассив| 20000000 | 210000000| 220000000|

ну и так далее. мучаюсь с PIVOT, что-то не выходит. недопонимаю. плюс к тому еще и столбцы должны добавляться динамически. подскажите, пожалуйста, как сделать.
15 май 13, 12:42    [14298393]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
и сколько колонок должно быть в отчете за 10 лет?
15 май 13, 12:44    [14298416]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Паганель,
за год нужно вывести
15 май 13, 12:47    [14298441]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
nikolka
за год нужно вывести

И что кто-то действительно будет листать вправо-влево 365 полей ?
15 май 13, 12:48    [14298458]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
nikolka
за год нужно вывести
nikolka
столбцы должны добавляться динамически
Вам не кажется, что одно другому противоречит?
15 май 13, 12:49    [14298464]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Glory,
да почему? 12) по месяцам
15 май 13, 12:49    [14298467]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
nikolka
да почему? 12) по месяцам

С чего вдруг дата превратилась в месяц ?
15 май 13, 12:50    [14298486]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Паганель,
я имела в виду про PIVOT, не заданные значения столбцов, а из базы
15 май 13, 12:51    [14298491]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Glory,
данные хранятся за месяц на первое число месяца.
15 май 13, 12:53    [14298518]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
nikolka
данные хранятся за месяц на первое число месяца.

И в чем тогда проблема в PIVOT указать 12 имен полей ?
15 май 13, 12:55    [14298544]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Glory,
если пользователь захочет отчет за другой год посмотреть?
15 май 13, 12:58    [14298572]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
nikolka
если пользователь захочет отчет за другой год посмотреть?

Я вам открою тайну - Номера/Имена месяцев в каждом году одинаковые
15 май 13, 12:59    [14298593]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
nikolka,

Для динамического именования столбцов запроса рекомендую использовать
SQL-запрос, динамически строящийся Вашим клиентским приложением

Если же важен именно результат (отчет на экране),
то рекомендую разворачивать данные не средствами БД,
а средствами Вашего движка отчетов (Crystal Reports или что у Вас там)
15 май 13, 13:00    [14298603]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Паганель, заинтересовал Crystal Reports. а у него может быть источник данных - файл базы данных .mdf? что-то не могу найти
15 май 13, 14:25    [14299358]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Выберите MS SQL Server или OleDB или уж ODBC, все лучше чем к файлу рубиться

А вообще https://www.sql.ru/forum/reporting
15 май 13, 14:55    [14299617]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
Паганель,

спасибо)

вопрос остается, пока другого решения найти не могу. может кто посоветует с запросом?
15 май 13, 15:37    [14299969]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
nikolka
Паганель,

спасибо)

вопрос остается, пока другого решения найти не могу. может кто посоветует с запросом?
Сказали же уже - взять 12 месяцев года - и вперёд!
Можно PIVOT, конечно.
А можно по старинке -
SUM(CASE WHEN ... THEN ... ELSE 0 END)
15 май 13, 15:41    [14300008]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
nikolka
Паганель,

спасибо)

вопрос остается, пока другого решения найти не могу. может кто посоветует с запросом?
Договоритесь с постановщиком задачи, чтобы имена полей были статическими [1], [2], [3]...[12] и никакой динамики не надо будет
На вход запрос пусть принимает номер года в виде параметра

Так нормально будет?
15 май 13, 15:41    [14300013]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
lapposv
Member

Откуда: Санкт-Петербург
Сообщений: 27
Я бы посоветовал смотреть на динамически формируемый запрос. Вот пример:
http://www.t-sql.ru/post/Crosstab.aspx
15 май 13, 17:15    [14300900]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

Откуда:
Сообщений: 62
фууууууууф.. ничего не выходит((( а как тогда вытащить наименования столбцов (статьи баланса)и поместить их в строчки.
помогите, горю....
15 май 13, 19:32    [14301676]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
mittagswind
Member

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

create table #balance(ID int identity(1, 1),	-- id записи
			bal_type nvarchar(10),	-- тип баланса (активы/пассивы)
			period nvarchar(10),	-- период
			value numeric(28, 8))	-- значение за период

-- наполнить немного таблицу
insert #balance (bal_type, period, value)
values ('активы', '01.2013', 100),
		('пассивы', '01.2013', 150),
		('активы', '02.2013', 200),
		('пассивы', '02.2013', 350),
		('активы', '03.2013', 600),
		('пассивы', '03.2013', 100),
		('активы', '04.2013', 700),
		('пассивы', '04.2013', 50),
		('активы', '05.2013', 80),
		('пассивы', '05.2013', 10)

-- так выглядит таблица до транспонирования
select * from #balance

declare @pvtList nvarchar(max),		-- переменная будет содержать список периодов/столбцов
	@sqlRun nvarchar(max)		-- здесь будет текст динамического запроса

-- получить список всех существующих периодов в таблице
select @pvtList = stuff(max(D.PeriodList), 1, 2, '')
		from (values ('')) T(c)
		cross apply 
		(select  distinct ', [' + period + ']' from #balance
				order by 1
				for xml path('') ) D ( PeriodList )

-- здесь можно посмотреть список полученных столбцов/периодов
print 'полученные периоды: ' + @pvtList

-- запрос для разворота данных
set @sqlRun = '
	select pvt.bal_type [статьи], [PvtList] from
	(select bal_type, period, value from #balance) src
	pivot (max(value) for period in ([PvtList])) pvt '
set @sqlRun = replace(@sqlRun, '[PvtList]', @pvtList) -- здесь идет текстовая замена в нужнео место списка периодов/столбцов

-- здесь можно посмотреть запрос, который сформировался для динамического спсика периодов
print 'полученный динамический код: ' + @sqlRun

-- вызов на выполнение
execute sp_executesql @sqlRun

-- удаление временной таблицы
drop table #balance


если есть какие-то вопросы по коду, отпишитесь здесь :-)
15 май 13, 21:21    [14302051]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
mittagswind
Member

Откуда:
Сообщений: 117
вот как это выглядит в действии:
Картинка с другого сайта.

К сообщению приложен файл. Размер - 58Kb
15 май 13, 21:29    [14302069]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

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

все отлично работает!! большое спасибо! вы просто Молодец)

только у меня в исходной таблице наименования статей актива - это наименования столбцов (id, period, oborotAktiv, VneoborotAktiv, Aktiv). вот их я не могу вытащить UNPIVOTом получается, но потом все равно нужен PIVOT. плюс еще и наименования статей в приличный вид нужно привести, в общем не под силам мне это...
15 май 13, 22:10    [14302207]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
mittagswind
Member

Откуда:
Сообщений: 117
список полей таблицы фиксирован - oborotAktiv, VneoborotAktiv, Aktiv или еще какие-то столбцы с суммами, которые надо разворачивать по периодам есть?
15 май 13, 23:21    [14302442]     Ответить | Цитировать Сообщить модератору
 Re: разворот таблицы  [new]
nikolka
Member

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

фиксирован, все статьи баланса (и актив и пассив)
15 май 13, 23:36    [14302489]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить