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

Откуда:
Сообщений: 43
Такая задачка возникла.

Допустим первоначально получили такие данные:
SELECT 
vend, sum(amt)
FROM
(
  SELECT
  bank.[Vendor] as vend, 
  bank.[Amount (LCY)] as amt
   
  FROM LedgerEntry
  Where 
  (bank.Date between '2011-01-01' and '2012-01-01'
) as t1

group by
vend


Итого получаем некоторые суммы сгруппированные по поставщику, за некоторые период.

Задача такая: пользователь хочет разбить временной промежуток на интервалы (например месяц) и детализировать группировку.

И сгруппировать данные по месяцам.
Получится результат что-то вроде:
Поставщик1 [01.01.2011..31.01.2011] 500
Поставщик1 [01.02.2011..29.02.2011] 1000

Вместо
Поставщик1 1500


Проблема в том что пользователь может разные интервалы такие выбирать (месяц, квартал, неделя)
+ работа с датами в SQL.

Вообщем стоит ли игра свеч?

Иначе придется просто выполнять SQL-запрос столько раз, сколько будет таких интервалов (если интервал месяц, а отчет за год, то 12 раз выполнить запрос).
14 июн 12, 14:15    [12713795]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
iap
Member

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

в общем случае надо иметь функцию (или выражение),
возвращающую одно и то же значение для заданного интервала,
но разные значения для разных интервалов. По ней и группировать.

Дело за малым - организовать такую функцию (или выражение).
Исходя из заданного типа интервала.
14 июн 12, 14:23    [12713875]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
Гузы
Guest
KeeperRU,
Вообще-то s't стандартная задачка для ОЛАПа.
14 июн 12, 14:24    [12713882]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
KeeperRU
Member

Откуда:
Сообщений: 43
iap
KeeperRU,

в общем случае надо иметь функцию (или выражение),
возвращающую одно и то же значение для заданного интервала,
но разные значения для разных интервалов. По ней и группировать.

Дело за малым - организовать такую функцию (или выражение).
Исходя из заданного типа интервала.


Вот с написанием функций на T-SQL беда, особенно если с датами.
Похоже придется тупо прогонять запрос много раз.

Хотя есть у меня идейка предварительно где-то табличку завести с интервалами и порядковым номером для каждого.
И там уж делать inner join какой-нить.
Так даже лучше.
14 июн 12, 14:32    [12713935]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
KeeperRU
Member

Откуда:
Сообщений: 43
Гузы
KeeperRU,
Вообще-то s't стандартная задачка для ОЛАПа.


Чем богаты тем и рады, сводная таблица в Excel и за 5 секунд бы справилась, но надо автоматизировать
14 июн 12, 14:33    [12713942]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Что-то не пойму, во FROMе нет никакого bank, а в SELECTе - bank.Date
В общем, как-то так:
GROUP BY
 CASE @PeriodType
  WHEN 'MONTH'   THEN DATEADD(MONTH,DATEDIFF(MONTH,0,bank.[Date]),0)
  WHEN 'QUARTER' THEN DATEADD(QUARTER,DATEDIFF(QUARTER,0,bank.[Date]),0)
  WHEN 'WEEK'    THEN DATEADD(WEEK,DATEDIFF(WEEK,0,bank.[Date]),0)
 END;
Причём здесь я использовал тот факт, что 1 января 1900 года - понедельник.
Если надо по-американски, то можно доработать и по-другому.
Главное, что этот CASE возвращает первую дату указанного периода, содержащего bank.[Date]
14 июн 12, 14:50    [12714035]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Честно говоря, я бы делал функцию зависящую от начальной и конечной дат...
А вот в вызавающем клиенте был-бы комбо-боксик
1 месяц
2 квартал
3 полугодие
4 год
5 выборочный период
И в зависимости от него задавал начальную и конечную даты...
Но это мое мнение...
14 июн 12, 14:56    [12714079]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным периодам (период в качестве параметра)  [new]
KeeperRU
Member

Откуда:
Сообщений: 43
iap
Что-то не пойму, во FROMе нет никакого bank, а в SELECTе - bank.Date
В общем, как-то так:
GROUP BY
 CASE @PeriodType
  WHEN 'MONTH'   THEN DATEADD(MONTH,DATEDIFF(MONTH,0,bank.[Date]),0)
  WHEN 'QUARTER' THEN DATEADD(QUARTER,DATEDIFF(QUARTER,0,bank.[Date]),0)
  WHEN 'WEEK'    THEN DATEADD(WEEK,DATEDIFF(WEEK,0,bank.[Date]),0)
 END;
Причём здесь я использовал тот факт, что 1 января 1900 года - понедельник.
Если надо по-американски, то можно доработать и по-другому.
Главное, что этот CASE возвращает первую дату указанного периода, содержащего bank.[Date]


Спасибо способ просто супер, будем искать подводные камни.
14 июн 12, 15:16    [12714213]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить