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

Откуда:
Сообщений: 204
Всем привет, есть такая таблица, не могу вывести нарастание итога по месяцам:
DECLARE @NN TABLE(N int identity, CD datetime)
insert into @NN values ('11-01-2013'), ('11-02-2013'), ('11-02-2013'), ('11-03-2013'), ('11-03-2013'), ('11-03-2013'), ('11-04-2013')
select * from @NN

Нужно получить такой результат:
MonthNum Total
1 1
2 3
3 6
4 7

Подскажите, как написать такой запрос?
7 янв 14, 06:24    [15383364]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
Ennor Tiegael
Member

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

select distinct sq.M, sq.RT
from (
	select datepart(month, n.CD) as [M], count(*) over(order by datepart(month, n.CD)) as [RT]
	from @NN n
) sq;
7 янв 14, 07:30    [15383386]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
Torre
Member

Откуда:
Сообщений: 204
Спасибо, Ennor Tiegael, пытаюсь получить результат, но анализатор ругается на order 'Incorrect syntax near the keyword 'ORDER', не могу пока понять почему, читаю доки, как будто все верно
7 янв 14, 07:53    [15383396]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
Ennor Tiegael
Member

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

Потому что по-простому нарастающий итог считается, начиная с 2012 версии, а у вас, судя по всему, более ранний сиквел.

А вообще, это даже в FAQе есть (там в комментах и другие варианты).
7 янв 14, 08:45    [15383410]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
Torre
Member

Откуда:
Сообщений: 204
Да, уже нашел, что running total (over(order by) отсутствует в 2008R2. Вижу, что для моего случая нет решения из коробки, поэтому воспользуюсь вашей ссылкой, спасибо.
7 янв 14, 08:55    [15383413]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
Torre
Member

Откуда:
Сообщений: 204
Словом, так и решил, способом "Update to a local variable": создал таблицу в запросе, вставил значения, затем вычислил сумму и update в колонку RT. Спасибо, Ennor Tiegael.
7 янв 14, 09:23    [15383422]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
sdet
Member

Откуда:
Сообщений: 463
Torre
Словом, так и решил, способом "Update to a local variable": создал таблицу в запросе, вставил значения, затем вычислил сумму и update в колонку RT. Спасибо, Ennor Tiegael.

И как обеспечили гарантированность порядка обновления?
7 янв 14, 12:01    [15383529]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Ennor Tiegael,

Т.е. чтобы подсчитать накопительный итог, копировать всю выборку в локальную табличку? о.О
Нет если уже данные и так там, конечно можно, и это уберёт необходимый в 2005 самоджойн.

Torre,

Если интересно:

IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T(GroupBy INT, OrderBy INT, Value MONEY)
;WITH CTE AS(SELECT 1N UNION ALL SELECT N+1 FROM CTE WHERE N<50)
INSERT #T
SELECT 10*(N/10), ((N-1)%10)+1, ABS(CAST(CAST(NEWID()AS VARBINARY)AS MONEY))%10000
FROM CTE

SELECT * 
FROM #T
ORDER BY GroupBy, OrderBy

--MS SQL 2012

SELECT *, SUM(Value)OVER(PARTITION BY GroupBy ORDER BY OrderBy ROWS UNBOUNDED PRECEDING)RunningTotal
FROM #T
ORDER BY GroupBy, OrderBy

--MS SQL 2005

SELECT T1.*, T1.Value + ISNULL(SUM(T2.Value), 0)
FROM #T T1
  LEFT JOIN #T T2 ON T1.GroupBy = T2.GroupBy AND T1.OrderBy > T2.OrderBy
GROUP BY T1.GroupBy, T1.OrderBy, T1.Value
ORDER BY GroupBy, OrderBy

SELECT T1.*, T1.Value +
  (
    SELECT ISNULL(SUM(T2.Value), 0)
    FROM #T T2
    WHERE T1.GroupBy = T2.GroupBy AND T1.OrderBy > T2.OrderBy
  )
FROM #T T1
ORDER BY GroupBy, OrderBy

IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T
8 янв 14, 05:34    [15385456]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
pegoopik
Т.е. чтобы подсчитать накопительный итог, копировать всю выборку в локальную табличку? о.О


А... так там всё написано. Каюсь, не прочитал:)
А вообще вариант с UPDATE как минимум интересен(не в плане вычисления итогов), надо будет побаловаться.
8 янв 14, 05:45    [15385457]     Ответить | Цитировать Сообщить модератору
 Re: Нарастание итога с группировкой по месяцам  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
[quot pegoopik]
pegoopik
надо будет побаловаться.


Числа фибоначи без рекурсии:
IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T(A BIGINT, B BIGINT)

DECLARE @A BIGINT = 1, @B BIGINT = 1

;WITH X(X) AS(SELECT NULL UNION ALL SELECT NULL)
INSERT #T SELECT NULL, NULL FROM X,X A,X B,X C

SELECT * FROM #T

UPDATE #T SET @A = A = @A + @B, @B = B = @A + @B

SELECT * FROM #T

IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T


А вот чего-то практически ценного придумать не получается...
8 янв 14, 05:56    [15385458]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить