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

Откуда:
Сообщений: 56
ребята у меня такая таблица:

Amount Date
1000 12.12.2014
-500 14.12.2014
-500 16.12.2014
200 22.12.2014
-50 28.12.2014
100 30.12.2014

Мне нужна из этого таблицы вычислит тока 2 цифры: 6 (дни в котором у меня нарастающий итог 0) и 4750 ( сумма итогов по дням где у меня нарастающий итог >0)
26 май 15, 14:05    [17690781]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Добрый Э - Эх
Guest
delphier,

приведенные данные не вяжутся со словесным описанием задачи. соответственно, ни разу не понятно, что же есть в наличие и чего нужно получить. приведи более репрезентативный набор тестовых данных и попробуй задать вопрос ещё раз
26 май 15, 14:19    [17690886]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
Чего-то вы непонятно задачу описали, откуда 4750


Если sql 2012, то нарастающие итого легко считаются с помощью конструкции ROWS UNBOUNDED PRECEDING https://msdn.microsoft.com/en-us/library/ms189461.aspx

SELECT BusinessEntityID, TerritoryID 
    ,CONVERT(varchar(20),SalesYTD,1) AS  SalesYTD
    ,DATEPART(yy,ModifiedDate) AS SalesYear
    ,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID 
                                             ORDER BY DATEPART(yy,ModifiedDate) 
                                             ROWS UNBOUNDED PRECEDING),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5;
26 май 15, 14:20    [17690892]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8584
delphier, так сделайте запрос формирования нарастающего итога и выбирайте из него что угодно. Вопрос-то в чем? Читайте FAQ, если не знаете, как написать такой запрос.
26 май 15, 14:21    [17690899]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
a_voronin
откуда 4750

Да вроде понятно... его данные должны быть развёрнуты в

AmountDateBalance
100012.12.20141000
13.12.20141000
-50014.12.2014500
15.12.2014500
-50016.12.20140
17.12.20140
18.12.20140
19.12.20140
20.12.20140
21.12.20140
20022.12.2014200
23.12.2014200
24.12.2014200
25.12.2014200
26.12.2014200
27.12.2014200
-5028.12.2014150
29.12.2014150
10030.12.2014250
ИТОГО4750
26 май 15, 14:26    [17690937]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
delphier
Member

Откуда:
Сообщений: 56
в excel сделал чтоб било понятнее. Если можете помогите как-нибудь решит эту задачу

К сообщению приложен файл (DATE.xlsx - 8Kb) cкачать
26 май 15, 14:28    [17690950]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Строй опорную таблицу дат... а дальше элементарно.
26 май 15, 14:29    [17690958]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Впрочем, можно и без неё - но если версия сервера не ниже 2012.
26 май 15, 14:53    [17691081]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
delphier
Member

Откуда:
Сообщений: 56
версия сервера 2012

может бить ешио ест варианты?
26 май 15, 15:01    [17691144]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Ну тогда вообще не вопрос. LAG(Date,1,0) OVER (ORDER BY Date DESC) даст тебе следующую строку, считаешь DATEDIFF и множишь на Amount. Всё это суммируешь, получаешь свои 4750. И аналогично, суммируя DATEDIFF для записей, где нарастающий итог нулевой, получишь свои 6.
26 май 15, 15:05    [17691176]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
delphier
Member

Откуда:
Сообщений: 56
попробую
26 май 15, 15:07    [17691193]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
a_voronin
Member

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

Давно не писал такого изврата

SET LANGUAGE RUSSIAN


SELECT DATE,  AMOUNT + AMOUNT3 FROM 
(
SELECT DATE,  AMOUNT, AMOUNT2, AMOUNT3 = SUM(AMOUNT2) OVER (ORDER BY DATE ROWS UNBOUNDED PRECEDING) FROM 
(
SELECT 
	DATE, AMOUNT, AMOUNT2 = ((DATEDIFF(DAY, LAG(DATE, 1, DATE) OVER (ORDER BY DATE), DATE)) * (LAG(AMOUNT, 1, 0)  OVER (ORDER BY DATE))) 
FROM 
(
	SELECT AMOUNT = (SUM(AMOUNT)  OVER (ORDER BY DATE ROWS UNBOUNDED PRECEDING)), DATE FROM 
	(
		VALUES
		(1000, '12.12.2014'),
		(-500, '14.12.2014'),
		(-500, '16.12.2014'),
		(200 , '22.12.2014'),
		(-50 , '28.12.2014'),
		(100 , '30.12.2014')
		)  AS T (Amount, Date)
	
) T
) T
) T
26 май 15, 15:22    [17691283]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
SELECT
  SUM(xSum*Delta) Sum1
, SUM(CASE xSum
      WHEN 0 
      THEN Delta
      ELSE 0
      END) Sum2
FROM (
  SELECT
    Amount
  , xDate
  , CASE WHEN DATEDIFF(day,xDate,LAG(xDate,1,0) OVER (ORDER BY xDate DESC)) < 0
    THEN 1
    ELSE DATEDIFF(day,xDate,LAG(xDate,1,0) OVER (ORDER BY xDate DESC))
    END Delta
  , SUM(Amount) OVER (ORDER BY xDate ASC) xSum
  FROM test
) x
26 май 15, 15:51    [17691491]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
http://sqlfiddle.com/#!6/2a62a/1
26 май 15, 15:55    [17691526]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
И да - из подзапроса поля Amount и xDate можно выбросить за ненадобностью.
26 май 15, 15:58    [17691552]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
http://sqlfiddle.com/#!6/bba1d/1
26 май 15, 15:59    [17691573]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
a_voronin
Member

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

только цифра не та у вас в результате
26 май 15, 16:09    [17691655]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
a_voronin
цифра не та у вас в результате

Результат корректный. Просто не ту ссылку дал - вот правильная: http://sqlfiddle.com/#!6/2a62a/1
А по ссылке выше - изменены исходные данные (сумма в последней записи), для проверки правильности работы подсчётов, когда конечный баланс нулевой.
26 май 15, 16:26    [17691753]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление по дням  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21101
Да что за ....
http://sqlfiddle.com/#!6/08fee/9
26 май 15, 16:30    [17691782]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить