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

Откуда:
Сообщений: 18
Есть задача все поступившие заявки сгрупировать по месяцам, годам.
Сейчас это реализовано курсором. Можно ли обойтись без него, одним запросом?

DROP TABLE #Dax
SET DATEFORMAT dmy
CREATE TABLE #Dax
	(Summa money,
	ZayvkaID int,
	DataPostup datetime)
	
INSERT INTO #Dax VALUES (55.10, 2, '10.03.2008')
INSERT INTO #Dax VALUES (1000,  4, '14.03.2008')
INSERT INTO #Dax VALUES (50.00, 2, '20.07.2008')
INSERT INTO #Dax VALUES (65.20, 2, '30.12.2008')
INSERT INTO #Dax VALUES (60.60, 2, '10.03.2009')
INSERT INTO #Dax VALUES (65.00, 2, '10.03.2009')
INSERT INTO #Dax VALUES (80.20, 2, '10.03.2009')
INSERT INTO #Dax VALUES (20.20, 3, '14.04.2009')
INSERT INTO #Dax VALUES (30.30, 2, '25.04.2009')
INSERT INTO #Dax VALUES (40.10, 3, '20.08.2009')
INSERT INTO #Dax VALUES (90.30, 1, '21.08.2009')
INSERT INTO #Dax VALUES (20.35, 1, '10.10.2009')

Хотелось бы получить выходные данные следущуго вида
55.10  2  10.03.2008
1000,  4, 14.03.2008
всего за март 2008 года 1055.10
50.00, 2, 20.07.2008
всего за июль 2008 года 50.00
65.20, 2, 30.12.2008
всего за декабрь 2008 года 65.20
всего за 2008 год 1170.30
60.60, 2, 10.03.2009
65.00, 2, 10.03.2009
80.20, 2, 10.03.2009
всего за март 2009 года 205.80
20.20, 3, 14.04.2009
30.30, 2, 25.04.2009
всего за апрель 2009 года 50.50
40.10, 3, 20.08.2009
90.30, 1, 21.08.2009
всего за август 2009 года 130.40
20.35, 1, 10.10.2009
всего за октябрь 2009 года 20.35
всего за 2009 год 407.05
1 дек 09, 09:14    [8000082]     Ответить | Цитировать Сообщить модератору
 Re: Subtotals, totals без курсора  [new]
caper
Member

Откуда: Москва
Сообщений: 418
как-то так (допилите до результата сами)
SET DATEFORMAT dmy
CREATE TABLE #Dax
	(Summa money,
	ZayvkaID int,
	DataPostup datetime)
	
INSERT INTO #Dax VALUES (55.10, 2, '10.03.2008')
INSERT INTO #Dax VALUES (1000,  4, '14.03.2008')
INSERT INTO #Dax VALUES (50.00, 2, '20.07.2008')
INSERT INTO #Dax VALUES (65.20, 2, '30.12.2008')
INSERT INTO #Dax VALUES (60.60, 2, '10.03.2009')
INSERT INTO #Dax VALUES (65.00, 2, '10.03.2009')
INSERT INTO #Dax VALUES (80.20, 2, '10.03.2009')
INSERT INTO #Dax VALUES (20.20, 3, '14.04.2009')
INSERT INTO #Dax VALUES (30.30, 2, '25.04.2009')
INSERT INTO #Dax VALUES (40.10, 3, '20.08.2009')
INSERT INTO #Dax VALUES (90.30, 1, '21.08.2009')
INSERT INTO #Dax VALUES (20.35, 1, '10.10.2009')

select * from
(
select *,
       month(DataPostup) as MM,
       year(DataPostup) as YY,
       1 as ORD
from   #Dax
union all
select sum(Summa),
		null,
		null,
       month(DataPostup) as MM,
       year(DataPostup) as YY,
       2 as ORD
from   #Dax
group by month(DataPostup) ,
		year(DataPostup) 
) t
order by MM,YY,ORD
drop table #Dax
1 дек 09, 09:43    [8000180]     Ответить | Цитировать Сообщить модератору
 Re: Subtotals, totals без курсора  [new]
aleks2
Guest
SET DATEFORMAT dmy
declare @Dax
	TABLE (Summa money,
	ZayvkaID int,
	DataPostup datetime)
	
INSERT INTO @Dax VALUES (55.10, 2, '10.03.2008')
INSERT INTO @Dax VALUES (1000,  4, '14.03.2008')
INSERT INTO @Dax VALUES (50.00, 2, '20.07.2008')
INSERT INTO @Dax VALUES (65.20, 2, '30.12.2008')
INSERT INTO @Dax VALUES (60.60, 2, '10.03.2009')
INSERT INTO @Dax VALUES (65.00, 2, '10.03.2009')
INSERT INTO @Dax VALUES (80.20, 2, '10.03.2009')
INSERT INTO @Dax VALUES (20.20, 3, '14.04.2009')
INSERT INTO @Dax VALUES (30.30, 2, '25.04.2009')
INSERT INTO @Dax VALUES (40.10, 3, '20.08.2009')
INSERT INTO @Dax VALUES (90.30, 1, '21.08.2009')
INSERT INTO @Dax VALUES (20.35, 1, '10.10.2009')


select Summa,ZayvkaID, DataPostup, ИТОГО,  ИТОГОMonth, ИТОГОSumma
from
(select Summa,ZayvkaID, DataPostup, null ИТОГО, null ИТОГОMonth, null ИТОГОSumma, DataPostup ord, 0 ord2
FROM @Dax
UNION ALL
select null Summa, null ZayvkaID, null DataPostup
    , 'за ' ИТОГО,dateadd(month, datediff(month, 0, MIN(DataPostup)), 0) Month, SUM(Summa) Summa
	, max(DataPostup) ord, 1 ord2
FROM @Dax
GROUP BY datediff(month, 0, DataPostup)
) X
ORDER BY ord asc, ord2 asc

--или
select Summa,ZayvkaID, DataPostup, ИТОГО
from
(select Summa,ZayvkaID, DataPostup, null ИТОГО,DataPostup ord, 0 ord2
FROM @Dax
UNION ALL
select SUM(Summa)  Summa, null ZayvkaID, dateadd(month, datediff(month, 0, MIN(DataPostup)), 0) DataPostup
    , 'ИТОГО' ИТОГО
	, max(DataPostup) ord, 1 ord2
FROM @Dax
GROUP BY datediff(month, 0, DataPostup)
) X
ORDER BY ord asc, ord2 asc
1 дек 09, 09:46    [8000192]     Ответить | Цитировать Сообщить модератору
 Re: Subtotals, totals без курсора  [new]
maquisard
Member

Откуда:
Сообщений: 18
caper, aleks2

Спасибо.
По месяцам получается, но нет итогов по годам.
1 дек 09, 09:54    [8000222]     Ответить | Цитировать Сообщить модератору
 Re: Subtotals, totals без курсора  [new]
VladimirKr
Member

Откуда: СПб
Сообщений: 1050
Имхо, select обычный union all select grouping rollup (см БОЛ)
1 дек 09, 09:58    [8000248]     Ответить | Цитировать Сообщить модератору
 Re: Subtotals, totals без курсора  [new]
caper
Member

Откуда: Москва
Сообщений: 418
maquisard,
ну добавьте третий подселект с соотв. группировкой и сортировкой :)
1 дек 09, 09:58    [8000249]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить