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

Откуда: Москва
Сообщений: 29
Господа, нужна Ваша помощь. Не могли бы ли Вы подсказать начинающему пользователю SQL, как можно из такой таблицы

TRADEDATEREGNUMBERWAP
2012-01-10RU1231
2012-01-10RU4562
2012-01-11RU1231.5
2012-01-11RU4652.3
...
...


получить следующее:

TRADEDATERU123RU456...
2012-01-1012...
2012-01-111.52.3...
......
......

Количество (список) REGNUMBER и TRADEDATE известно заранее. Заранее благодарен.
14 фев 12, 22:44    [12092289]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

а чем не устраивает собственно PIVOT?
14 фев 12, 23:45    [12092456]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ну слово PIVOT вы написали, и даже накалякали текст поста. В чём проблема?
Смотри банально пару примеров и вникаем в азы, буки, веди ...
14 фев 12, 23:50    [12092476]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
Прежде всего, спасибо за ответы.

Вопрос заключается в следующем:

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

Спасибо.
15 фев 12, 09:17    [12093213]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
d.guryev
можно ли сделать это с помощью PIVOT или нельзя?
Можно.

d.guryev
т.к. мне сказали, что с помощью PIVOT можно решать подобные задачи, но только с использованием агрегирующих функций.
А разве PIVOT можно написать без агрегирующих функций?

Посмотрите ссылки от Mnior, там всё понятно. Практически нужно только заменить названия таблиц и полей :-)
15 фев 12, 09:30    [12093238]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

можно
15 фев 12, 09:32    [12093243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
alexeyvg,

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

Откуда:
Сообщений: 8711
d.guryev
alexeyvg,

Спасибо за ответ.
Я имел ввиду, что ряд данных должен остаться каким он и является, т.е. не использовать такие функции, как счет, сумма, среднее и т.д.


Как вы думаете, что произойдет, если примеринть агрегирующую функцию к ряду, содержащему одно значение?
15 фев 12, 09:51    [12093331]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
d.guryev, комбинация "TRADEDATE, REGNUMBER" уникальна? Возможна ли ситуация вида:
TRADEDATEREGNUMBERWAP
2012-01-10RU1231
2012-01-10RU1232
...
...

и каков должен быть результат?
15 фев 12, 09:55    [12093353]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Так почему одно значение? Там временной ряд данных.
15 фев 12, 10:01    [12093382]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
kDnZP,

Как Вы создали таблицу, так я знаю как сделать, просто обычный запрос с where REGNUMBER = 'RU123'. Но меня это вариант не утсраивает, т.к. у меня этих 'RU***' около 50. Таким образом, хотелось бы решить задачу одним запросом, а не писать каждый раз: select TRADEDATE,WAP AS 'RU***' from dbo.Table where REGNUMBER = 'RU***' order by TRADEDATE.
15 фев 12, 10:08    [12093413]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

вы про PIVOT хоть что-нибудь прочитали?
15 фев 12, 10:11    [12093427]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Пытаюсь в данный момент времени, понять логику решения "базового примера".
15 фев 12, 10:14    [12093439]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev
iljy,

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

declare @t table (id int, Name varchar(10), val int)
insert @t values
(1,'a',1),(1,'b',2),(1,'b',20),(1,'c',3),(2,'a',4),
(2,'c',5),(3,'a',6),(3,'b',7),(3,'c',8)

select * from @t pivot
(sum(val) for Name in([a],[b],[c])) pvt

select id, SUM(case Name when 'a' then val end) a,
	SUM(case Name when 'b' then val end) b,
	SUM(case Name when 'c' then val end) c
from @t
group by id
15 фев 12, 10:25    [12093504]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
kDnZP
Member [заблокирован]

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

Как Вы создали таблицу, так я знаю как сделать, просто обычный запрос с where REGNUMBER = 'RU123'. Но меня это вариант не утсраивает, т.к. у меня этих 'RU***' около 50. Таким образом, хотелось бы решить задачу одним запросом, а не писать каждый раз: select TRADEDATE,WAP AS 'RU***' from dbo.Table where REGNUMBER = 'RU***' order by TRADEDATE.

Вы на вопрос-то ответьте.
15 фев 12, 10:32    [12093533]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
kDnZP
Member [заблокирован]

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

Спасибо за ответ.
Я имел ввиду, что ряд данных должен остаться каким он и является, т.е. не использовать такие функции, как счет, сумма, среднее и т.д.

declare @t table (id int, Name varchar(10), val int)
insert @t values
(1,'a',1),(1,'b',2),(1,'b',20),(1,'c',3),(2,'a',4),
(2,'c',5),(3,'a',6),(3,'b',7),(3,'c',8)

SELECT  id,
        SUM(CASE Name
              WHEN 'a' THEN val
            END) a,
        SUM(CASE Name
              WHEN 'b' THEN val
            END) b,
        SUM(CASE Name
              WHEN 'c' THEN val
            END) c
FROM    (SELECT  id,
        Name,
        val, ROW_NUMBER() OVER (PARTITION BY id,Name ORDER BY val) rn FROM @t) t
GROUP BY t.id, t.rn
ORDER BY t.id, t.rn

?
15 фев 12, 10:44    [12093588]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
kDnZP,

Комбинация "TRADEDATE, REGNUMBER" не уникальна, т.е. TRADEDATE это ряд дней скажем с 01.01.2011 по 01.01.2012 и есть список REGNUMBER, по каждому REGNUMBER в каждый из дней есть значение. Таким образом, если 250 дней и 4 REGNUMBER, то всего 1000 значений.
15 фев 12, 10:59    [12093655]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Спасибо огромное за помощь, изменил, получилось, работает. Не подскажите еще такой момент:

[a],[b],[c] , в вашем примере, можно ли изменить на что-нибудь как "select Names from dbo.Table_Names". Т.к. в моем конкретном случае один раз может быть a,b,c другой раз a,b,c,d потом a,b.

Еще раз, спасибо.
15 фев 12, 11:03    [12093692]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

7242227
15 фев 12, 11:05    [12093705]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Спасибо еще раз. Посмотрел и попробовад переформулировать для моего случая, но как-то не получается...Если не сложно, можешь подсказать в чем ошибка.

create table #t (Trade date, Name varchar(255), val float)
insert #t
select TradeDate as Trade, RegNumber as Name,WAPrice as val from dbo.Test
where RegNumber IN ('1-02-00028-A','1-01-40155-F')
and and TradeDate between '2012-01-01' and '2012-01-07'

declare @PNames as varchar(1024)
set @PNames = ''
select @PNames = @PNames + ',' +  Name from #t group by Name
set @PNames = substring(@PNames, 2, len(@PNames))

declare @Sql varchar(8000)
set @Sql = 
'SELECT *' + ' FROM #t' +
' PIVOT ('+
' sum(val)'+
' FOR Name IN	(' + @PNames + ')'+
' ) AS pvt'
EXEC(@Sql)


Если вставить [1-02-00028-A],[1-01-40155-F] вместо @PNames, то все работает. А с @PNames выдает ошибку.
Заранее благодарен.
15 фев 12, 14:04    [12095616]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

замените EXEC на PRINT
15 фев 12, 14:05    [12095627]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Спасибо за подсказку. :)

Вставил скобочки и заработало :)

Спасибо огромное за помощь.
15 фев 12, 14:13    [12095699]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
iljy
Member

Откуда:
Сообщений: 8711
d.guryev,

не за что!
Только пара советов:
1. конструкция select @PNames = @PNames + .... не очень надежна, да и неэффективна. Лучше использовать сборку строки через FOR XML:
declare @t table (id int, Name varchar(10), val int)
insert @t values
(1,'a',1),(1,'b',2),(1,'b',20),(1,'c',3),(2,'a',4),
(2,'c',5),(3,'a',6),(3,'b',7),(3,'c',8)

declare @PNames as varchar(1024)
set @PNames = substring(
	(select ',[' +  Name  + ']' from @t group by Name for xml path(''),type).value('.','varchar(1024)'), 2, 8000)
select @PNames


2. Использование динамики в принципе довольно накладно, да и неудобно - неизвестна структура таблицы, работать с ней очень тяжело. Так что, если у вас максимальный набор значений все-таки предопределенный, лучше использовать статику, пусть некоторые поля будут всегда NULL.
15 фев 12, 14:27    [12095852]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
d.guryev
Member

Откуда: Москва
Сообщений: 29
iljy,

Приветствую, у меня небольшая проблемка. Написал процедуру, которая создяет табличку с заранее неизвестным количеством столбцов, так, чтобы имена столбцов совпадали с тем, что мы получаем в результате PIVOT. Далее пытался вставить в таблицу то, что получаем от PIVOT, но SQL ругается.
EXEC('INSERT INTO dbo.FinalTable SELECT * FROM (' + @SQL + ')')


Если не сложно, можешь подсказать как результат PIVOT вставить в табличку.
24 фев 12, 09:26    [12144992]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с чем-то вроде PIVOT  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
d.guryev,
select ... into ... from ...

но мне так кажется что вы делаете что-то совсем не то)))
24 фев 12, 09:53    [12145101]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить