Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать данную задачу... 
:(
    Опции темы
MaxxSoftware
Дата 27.2.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Есть запрос:
Код

select po, du,dv, count(pay_id) as c, sum (cost) as summ
from pay
where pay_id<15000 and dv between 5 and 7
group by po,du,dv
order by po,du,dv


Возвращает он такие данные:
po______du______dv_____c_______summ
___________________________________________
Ц001____84______5_____53_____103369.1100
Ц001____84______6_____46_____111993.1800
Ц001____84______7_____44_____118300.9900
Ц001____85______5_____59_____158248.1000
Ц001____85______6_____54_____133919.4100
Ц001____85______7_____62_____189471.7000
Ц002____88______5_____74_____183814.5400
Ц002____88______6_____71_____182140.3500
Ц002____88______7_____60_____176663.4700


Нужно сделать так - что бы каждое значение столбца dv стало ОТДЕЛЬНЫМ столбцом...
в данном примере результат должен стать таким:

po____du__dv5c__dv5summ___dv6с___dv6summ___dv7c___dv7summ
____________________________________________________________
Ц001__84___53__103369.11___46____111993.18___44___118300.99
Ц001__85___59__158248.10___54____133919.41___62___189471.70
Ц002__88___74__183814.54___71____182140.35___60___176663.47

При этом диапазон dv может менятся... в данном примере он с 5 до 7...

Я пытался реализовать это так:

Код

declare @beg_day as int
declare @end_day as int
set @beg_day = 5
set @end_day = 7

select po as po, du as du into #temp
from pay
where pay_id<15000
group by po,du
order by po,du

while @beg_day <= @end_day
begin
    select po, du, count(pay_id), sum (cost) into #temp2
    from pay
    where pay_id<15000 and dv = @beg_day
    group by po,du
    order by po,du

    select #temp.*, #temp2.* into #result
    from #temp
    left join 
    #temp2
    on #temp.po = #temp2.po and #temp.du = #temp2.du

    drop table #temp
    drop table #temp2
    select * into #temp
    from #result
    drop table #result

    set @beg_day = @beg_day + 1
    if @beg_day > @end_day
        break
    else
        continue
end

select * from #temp

drop table #temp


Не выходит smile ошибка:
Server: Msg 2714, Level 16, State 1, Line 29
There is already an object named '#temp' in the database.
Хотя в цикле эта таблица дропается...

Может будут другие варианты решения( smile smile )? либо укажите на ошибку?
зарание благодарен...

Это сообщение отредактировал(а) MaxxSoftware - 27.2.2006, 09:10
PM MAIL   Вверх
HalkaR
Дата 27.2.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

Репутация: нет
Всего: 42



Код

declare @beg_day as int
declare @end_day as int
set @beg_day = 5
set @end_day = 7
if exists (select * from dbo.sysobjects where id = object_id(N'[#temp]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table [#temp]
select po as po, du as du into #temp
from pay
where pay_id<15000
group by po,du
order by po,du
while @beg_day <= @end_day
begin
    if exists (select * from dbo.sysobjects where id = object_id(N'[#temp2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
      drop table [#temp2]
    select po, du, count(pay_id), sum (cost) into #temp2
    from pay
    where pay_id<15000 and dv = @beg_day
    group by po,du
    order by po,du
    select #temp.*, #temp2.* into #result
    from #temp
    left join 
    #temp2
    on #temp.po = #temp2.po and #temp.du = #temp2.du
    drop table #temp
    drop table #temp2
    select * into #temp
    from #result
    drop table #result
    set @beg_day = @beg_day + 1
    if @beg_day > @end_day
        break
    else
        continue
end
select * from #temp
drop table #temp
попробуй так чтоли smile
PM MAIL   Вверх
MaxxSoftware
Дата 27.2.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 23.5.2005

Репутация: нет
Всего: нет



Извиняюсь, поторопился спросить...
сделал так -
Код

declare @t table (po char(5), du int, dv int, c int, summ real)

insert @t select po,du,dv, count(pay_id), sum(cost) from pay where dv between 5 and 8
group by po,du,dv

select distinct
    t1.po,t1.du,
    (select t2.c from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=5) dv5c,
    (select t2.summ from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=5) dv5summ,
    (select t2.c from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=6) dv6c,
    (select t2.summ from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=6) dv6summ,
    (select t2.c from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=7) dv7c,
    (select t2.summ from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=7) dv7summ,
    (select t2.c from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=8) dv8c,
    (select t2.summ from @t t2 where t1.po=t2.po and t1.du=t2.du and t2.dv=8) dv8summ
from @t t1


но интерестно было бы и другие варианты услышать
Добавлено @ 10:55
HalkaR, не, у тя такой же ашипка
PM MAIL   Вверх
Akina
Дата 27.2.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Что бы тебе в сторону pivot table не посмотреть, а?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.