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

Откуда:
Сообщений: 234
Всем привет.

Есть таблица с фактическими данными: дата, атрибут (некий атрибут сущности), сумма
Возможно ли в один проход с помощью аналитических функций расчитать сумму за прошлый год к текущей дате.
Например, для даты 2013-18-09 нужно получить сумму за период с 2012-01-01 по 2012-18-09. Сумму year to date посчитал, хочу получить и Last YTD :) Дважды использовать факт не очень хочется
Сервер 2012-й
Спасибо
18 сен 13, 12:33    [14853751]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SUM(CASE WHEN дата BETWEEN @CurYearBegin AND @CurDate THEN сумма ELSE 0 END) AS сумма_текущ,
SUM(CASE WHEN дата BETWEEN @PrevYearBegin AND @PrevDate THEN сумма ELSE 0 END) AS сумма_прошл
18 сен 13, 12:42    [14853810]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sum over year + month от даты ? 2012 вроде ето позволяет..если я правильно понял что надо
18 сен 13, 12:43    [14853814]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Прошу прощения, под "к текущей дате" я имел в виду не текущую дату (current), а дату, которая хранится в записи.
То есть в пределах каждого года (PARTITION BY Year(FactTable.DateTrans) ...) для каждой записи мне необходимо определять сумму YearToDate и LastYearToDate
18 сен 13, 12:51    [14853880]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35385
Блог
Новичок_я,

Хранилище данных?
Посмотрите на YTD + ParallelPeriod в SSAS
18 сен 13, 12:54    [14853895]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Критик
Новичок_я,

Хранилище данных?
Посмотрите на YTD + ParallelPeriod в SSAS

Да, ХД.
SSRS и SSAS не использую. Собственно, как сделать в BI - знаю, как сделать не в один проход тоже знаю. А как сделать в один проход (т.е. использовать таблицу фактов один раз) - не могу придумать =)
Фактически, надо два окна - одно по текущему году, другое - по предыдущему, если я правильно себе это представляю
18 сен 13, 13:00    [14853935]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
1)

t1.fact, sum(t2.fact)
from 
	[table] as t1
	 left join [table] as t2 on t2.дата between '2012-01-01' and dateadd(yy,-1,t1.дата)
	  and t1.товары = t2.товары and ....

(+ всякие isnull прописать, '2012-01-01' заменить вычислением первой даты года - при необходимости)

2) как верно написали, в SSAS всё это есть, читайте хелп
18 сен 13, 13:09    [14853987]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
StarikNavy
1)

t1.fact, sum(t2.fact)
from 
	[table] as t1
	 left join [table] as t2 on t2.дата between '2012-01-01' and dateadd(yy,-1,t1.дата)
	  and t1.товары = t2.товары and ....

(+ всякие isnull прописать, '2012-01-01' заменить вычислением первой даты года - при необходимости)

2) как верно написали, в SSAS всё это есть, читайте хелп


Спасибо =)
Но:
1. Хочу использовать факт один раз, в Вашем предложении факт используется дважды. Как сделать с джоинами - я знаю =)
2. У меня НЕ SSAS
18 сен 13, 13:15    [14854038]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Новичок_я,

а 0 раз использовать почему не хотите? сколько ресурсов сЪэкономится? ;)
18 сен 13, 15:20    [14854906]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Glory
Member

Откуда:
Сообщений: 104751
Новичок_я
1. Хочу использовать факт один раз, в Вашем предложении факт используется дважды.

Вы про количество физических обращений к таблице или про количество ее упоминаний в тексте запроса ?
18 сен 13, 15:28    [14854971]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
Новичок_я
2. У меня НЕ SSAS


у каждого свои недостатки (с)
18 сен 13, 16:31    [14855617]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Glory
Новичок_я
1. Хочу использовать факт один раз, в Вашем предложении факт используется дважды.

Вы про количество физических обращений к таблице или про количество ее упоминаний в тексте запроса ?

Имел в виду количество обращений
19 сен 13, 05:36    [14857366]     Ответить | Цитировать Сообщить модератору
 Re: Таблица фактов - расчет Last Year to Date  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Новичок_я,

В одно обращение к фактам можно, но вот без джойнов, имхо, не обойтись:
+
declare @years table (
	Interval int primary key,
	PeriodStart date not null,
	PeriodEnd date not null
);

insert into @years (Interval, PeriodStart, PeriodEnd)
values
	(2011, '20100101', '20120101'),
	(2012, '20110101', '20130101'),
	(2013, '20120101', '20140101');

declare @t table (
	AttributeId int not null default 1,
	DT datetime not null,
	Amount money null
);

insert into @t (DT, Amount)
values
	('20100407', 281),
	('20110212', 144),
	('20110911', 1083),
	('20120105', 11),
	('20120606', 27),
	('20121111', 189),
	('20121231', 141),
	('20130302', 77);

select sq.AttributeId, sq.DT, sq.Amount, sq.RunningTotal
from (
	select t.AttributeId, t.DT, t.Amount, sum(t.Amount) over(partition by t.AttributeId, y.Interval order by t.DT) as [RunningTotal], y.Interval
	from @t t
		inner join @years y on t.DT >= y.PeriodStart and t.DT < y.PeriodEnd
	) sq
where sq.Interval <= year(sq.DT)
order by sq.DT;
Считает вроде правильно, даже граничные условия обрабатывает, но вот какая именно логика стоит за этим запросом, я вам, боюсь, объяснить не смогу. Может, сами разберетесь

ЗЫ И скорее всего, вы совершенно зря думаете, что чем меньше обращений к таблице, тем быстрее будет работать.
19 сен 13, 10:03    [14857738]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить