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

Откуда:
Сообщений: 13
Есть табличка Table1
Symbol Date Value
A01.07.20115
B01.07.201115
C01.07.201125
A02.07.20118
B02.07.201114
C02.07.201127
.........


Надо сделать запрос, чтобы получился подобный результат
Symbol01.07.201102.07.2011
A58
B1514
C2527


Диапазон дат варьируется.
Сервер 2000-й.
Я так понимаю это возможно сделать посредством CASE в цикле.
Пытаюсь сделать вот так:
DECLARE @_date datetime        --потом будет входным параметром 
DECLARE @from_date datetime    --потом будет входным параметром
DECLARE @to_date datetime
SET @from_date = '20110701'
SET @to_date = '20110711'
SET @_date = @from_date
select Table1.Symbol
	WHILE (@_date BETWEEN @from_date and @to_date)
	BEGIN
		(CASE WHEN Table1.Date = @_date THEN Table1.Val) as @_date
		@_date = DATEADD(day, 1, @_date)		
	END
FROM Table1

Но сервер ругается на "Incorrect syntax near the keyword 'CASE'".
Если ход мыслей верный - подскажите как правильно написать. Если нет - расскажите в какую сторону копать. Спасибо.
11 июл 11, 17:56    [10957516]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
Glory
Member

Откуда:
Сообщений: 104751
mr.george
Если нет - расскажите в какую сторону копать. Спасибо.

В сторону поиска в хелпе по слову PIVOT
11 июл 11, 18:00    [10957558]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
mr.george, max(case ...) group by ... и никаких циклов.
11 июл 11, 19:26    [10958015]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
mr.george
Member

Откуда:
Сообщений: 13
Glory
В сторону поиска в хелпе по слову PIVOT

Сервер MS SQL 2000 - он PIVOT не знает.
12 июл 11, 10:56    [10960269]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP
mr.george, max(case ...) group by ... и никаких циклов.

Эту комбинацию знает. Поиском можете даже примеры найти.
12 июл 11, 10:59    [10960288]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
_ч_
Member

Откуда:
Сообщений: 1446
mr.george,

declare @t table (symbol nvarchar(1),	[Date] datetime, 	Value int)

insert into @t
select 'A',	'20110701', 5
union select 'B',	'20110701', 15
union select 'C', '20110701', 25
union select 'A', '20110702', 8
union select 'B', '20110702', 14
union select 'C', '20110702', 27

select symbol, MAX(case [Date] WHEN '20110701' THEN Value END) AS [01.07.2011],
MAX(case [Date] WHEN '20110702' THEN Value END) AS [02.07.2011]
 from @t
group by symbol
12 июл 11, 11:06    [10960330]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
mr.george
Member

Откуда:
Сообщений: 13
kDnZP
kDnZP
mr.george, max(case ...) group by ... и никаких циклов.

Эту комбинацию знает. Поиском можете даже примеры найти.

Да, понял что с " max(case ...) group by " это можно сделать. Пока ковыряюсь... Спасибо!
12 июл 11, 11:37    [10960513]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
mr.george
Member

Откуда:
Сообщений: 13
Что-то не получается сформировать столбцы по каждой дате.
Написал так:
SELECT Table1.Symbol,
	MAX(CASE WHEN Table1.Date > @from_date and Table1.Date < @to_date THEN Table1.Value END)
FROM Table1
GROUP BY Table1.Symbol

Результат получается таким:
Symbol(No column Name)
A8
B15
c27


А должно получится
Symbol(No column Name) (No column Name) ...
A58...
B1514...
c2527...

И не понятно как в результате обозвать колонки значением Table1.Date.
Пример _ч_ не подходит, т.к это для конкретных дат, а мне надо чтобы столбцы формировались из диапазона дат.
12 июл 11, 12:17    [10960750]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
_ч_
Member

Откуда:
Сообщений: 1446
mr.george,

т.е. число столбцов в запросе заранее неизвестно?
12 июл 11, 13:13    [10961145]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
mr.george
Member

Откуда:
Сообщений: 13
_ч_
mr.george,

т.е. число столбцов в запросе заранее неизвестно?

в том то и дело
Пользователь выбирает диапазон дат, надо по ним сформировать отчет.
12 июл 11, 13:19    [10961177]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
mr.george,

set dateformat dmy

create table #t (symbol nvarchar(1),	[Data] datetime, 	Value int)
insert into #t
select 'A',	'20110701', 5 union all select 'B',	'20110701', 15 union all select 'C', '20110701', 25 union all select 'A', '20110702', 8 union all
select 'B', '20110702', 14 union all select 'C', '20110702', 27 union all select 'A', '20110703', 9 union all select 'B', '20110703', 15 union all
select 'C', '20110703', 28

select * from #t order by data, symbol

declare @s varchar(max)
set @s = ''

select top 1 with ties @s =  @s + 'MAX(case Data WHEN ''' + convert(varchar,data,104) + ''' then value end) [' + convert(varchar,data,104) +'],' + char(10)
from #t
where data is not null order by row_number() over (partition by data order by data)

select @s = 'select symbol,' + char(10) + substring(@s, 1, len(@s)-2) + char(10) + 'from #t' + char(10)+ 'group by symbol'

print @s
exec(@s)

drop table #t
12 июл 11, 13:20    [10961189]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
_ч_
Member

Откуда:
Сообщений: 1446
mr.george
_ч_
mr.george,

т.е. число столбцов в запросе заранее неизвестно?

в том то и дело
Пользователь выбирает диапазон дат, надо по ним сформировать отчет.

Тогда динамика вам в руки
12 июл 11, 13:24    [10961223]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
mr.george,

select top 1 * from фрукты
12 июл 11, 13:28    [10961252]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP
mr.george,

select top 1 * from фрукты

Поломал(((, теперь эта тема верхней.
12 июл 11, 13:30    [10961271]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
2000_eto_dazhe_ne_2005
Guest
Начинающий SQL 2008,
okonnyx funktsij v 2000 net
12 июл 11, 13:50    [10961393]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
2000_eto_dazhe_ne_2005,

Да, че-то невнимательно прочитал начало топика...
Но kDnZP дал правильную ссылку.
12 июл 11, 13:57    [10961426]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое формирование столбцов даты  [new]
mr.george
Member

Откуда:
Сообщений: 13
kDnZP
kDnZP
mr.george,

select top 1 * from фрукты

Поломал(((, теперь эта тема верхней.

Спасибо! Теперь все понятно, получилось.
12 июл 11, 15:42    [10962328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить