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

Откуда:
Сообщений: 55
declare @tbl table
(
god int ,
mes int ,
kol int 
)

declare @i int 
set @i=1 
while @i<11
begin 
	insert into @tbl(god,mes,kol)
	values (2010,1,1)
	print @i
	set @i=@i+1
	
end 
set @i=1 
while @i<11
begin 
	insert into @tbl(god,mes,kol)
	values (2010,2,1)
	print @i
	set @i=@i+1
	
end 
set @i=1 
while @i<11
begin 
	insert into @tbl(god,mes,kol)
	values (2010,3,1)
	print @i
	set @i=@i+1
	
end 
set @i=1 
while @i<11
begin 
	insert into @tbl(god,mes,kol)
	values (2010,4,1)
	print @i
	set @i=@i+1
	
end 
set @i=1 
while @i<11
begin 
	insert into @tbl(god,mes,kol)
	values (2010,5,1)
	print @i
	set @i=@i+1
	
end 


Как в селекте получить следующий результат :
god : 2010 mes:1 kol: 10
god : 2010 mes:2 kol: 20
god : 2010 mes:3 kol: 30
god : 2010 mes:4 kol: 40
god : 2010 mes:5 kol: 50

То есть количество по накопительнои но сгрупировано по году и мес.
3 сен 14, 14:35    [16529453]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Поищите в FAQ статью "Нарастающий итог".
3 сен 14, 14:44    [16529527]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
saalex,

select
	god,
	mes,
	sum(sum(kol)) over (order by god, mes rows between unbounded preceding and current row) as kol
from
	@tbl
group by
	god,
	mes;
3 сен 14, 14:45    [16529531]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
saalex
Member

Откуда:
Сообщений: 55
У меня sql2008
3 сен 14, 15:05    [16529701]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
saalex, посмотрите на этот вариант:

select god, mes, sum(kol)
  from @tbl
 group by rollup (god,mes);


Если еще освоить функции grouping_id, то может получиться очень красивый отчет.

Вместо rollup попробуйте написать cube.
3 сен 14, 15:09    [16529750]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
Wlr-l
Member

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

... sum(sum(kol))  ...


Зачем так сложно?
3 сен 14, 15:13    [16529792]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Wlr-l
churupaha,

... sum(sum(kol))  ...


Зачем так сложно?


ваш запрос с rollup не решает задачу
3 сен 14, 15:18    [16529837]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
saalex, кстати циклы могут вкладываться один в другой, поэтому вместо последовательности циклов можно написать так:

declare @i int, @m int; 
set @m=1;

while @m<11 begin
      set @i=1;
      while @i<11 begin 
            insert into @tbl(god,mes,kol)
              values       (2010, @m,  1);
              print @i;
              set @i=@i+1;
      end;
      set @m=@m+1;
end;

В качестве упражнения попробуйте добавить цикл по годам.
3 сен 14, 15:27    [16529916]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
Wlr-l
Member

Откуда:
Сообщений: 602
churupaha, почему же не решает?
3 сен 14, 15:28    [16529927]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Wlr-l
churupaha, почему же не решает?


автору надо:

godmeskol
2010110
2010220
2010330
2010440
2010550


а rollup сделает так

2010110
2010210
2010310
2010410
2010510
2010NULL50
NULLNULL50
3 сен 14, 15:39    [16530001]     Ответить | Цитировать Сообщить модератору
 Re: Сложный Селект  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Wlr-l
saalex, кстати циклы могут вкладываться один в другой, поэтому вместо последовательности циклов можно написать так:

declare @i int, @m int; 
set @m=1;

while @m<11 begin
      set @i=1;
      while @i<11 begin 
            insert into @tbl(god,mes,kol)
              values       (2010, @m,  1);
              print @i;
              set @i=@i+1;
      end;
      set @m=@m+1;
end;

В качестве упражнения попробуйте добавить цикл по годам.


зачем?

select top(50)
	2010 as [god], row_number() over(order by (select 0)) % 5 + 1 as [mes], 1 as kol
from
	master..spt_values t1
3 сен 14, 15:41    [16530013]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить