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

Откуда:
Сообщений: 67
Гуру, подскажите как лучше
есть набор коэффициентов, и каждый коэффициент действует в каком-либо месяце

к1 : январь, февраль
к2: январь, март, август

есть, ну допустим, таблица продаж
CREATE TABLE [Sales](	
	[date_sales] [date] NULL,
	[Summa] [float] NULL
	
) ON [PRIMARY]


insert into Sales
select '2013-01-01', 150
union
select '2013-02-02', 350



как лучше хранение коэффициентов организовать чтобы потом проще считать было?
Т.е. что-то вроде такого
select  
	date_sales
	,summa as s
	,summa *( case datepart(mm,date_sales)  in... then k1 else 0 end) as sum_k1
	,summa *( case datepart(mm,date_sales) in ... then k2 else 0 end) as sum_k2
from
	Sales...
4 окт 13, 15:20    [14924612]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlexBra
как лучше хранение коэффициентов организовать чтобы потом проще считать было?

как таблицу с периодом действия каждого коэффициента
4 окт 13, 15:22    [14924626]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

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

вот такой вариант имеет право быть?
k1 = 10
k2 = 1

CREATE TABLE [Sales_koef](	
	[id_month] [int] NULL,
	[k1] [float] NULL,
	[k2] [float] NULL	
	
) ON [PRIMARY]


insert into Sales_koef
select 1, 10, 0
union
select 2, 10, 1
union
select 3, 0, 0
...
select  12, 0, 0

select  
	date_sales
	,summa as ss
	,summa * k1 as sum_k1
	,summa * k2  as sum_k2
from
	Sales as s left join Sales_koef as k on datepart(mm,s.date_sales) = k.id_month
	
	drop table Sales_koef
	drop table Sales


или "период действия каждого коэффициента" как-то лучше по другому задавать?
4 окт 13, 15:32    [14924695]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlexBra
вот такой вариант имеет право быть?

Любой вариант имеет право быть. На то он и вариант

AlexBra
или "период действия каждого коэффициента" как-то лучше по другому задавать?

Для меня лично период - это даты начала и дата конца
Потому что месяцев всего 12. А годов - гараздо больше
И коэффициенты хранить вертикально, а не горизонтально
4 окт 13, 15:35    [14924717]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

Откуда:
Сообщений: 67
Glory

Для меня лично период - это даты начала и дата конца
Потому что месяцев всего 12. А годов - гараздо больше
И коэффициенты хранить вертикально, а не горизонтально


таким образом?
CREATE TABLE [Sales_koef](
[id_k] [float] NULL,
[summ_k] [float] NULL ,
[date_begin] [date] NULL,
[date_end] [date] NULL,
) ON [PRIMARY]

insert into Sales_koef
select 1, 10, '2013-01-01','2013-01-31'
...

коэффициенты задаются только помесячно, поэтому думал без дат/годов обойтись
4 окт 13, 15:45    [14924821]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlexBra
коэффициенты задаются только помесячно

А если завтра будут по недельно ? Или по квартально ?
4 окт 13, 15:46    [14924839]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

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

т.е. если готовимся к универсальности (и изменчивости заказчика), то так:
CREATE TABLE [Sales_koef2](	
	[id_k] [int] NULL,
	[summ_k] [float] NULL	,
	[date_begin] [date] NULL,
	[date_end] [date] NULL,		
) ON [PRIMARY]

insert into Sales_koef2
select 1, 10, '2013-01-01','2013-01-31' union
select 1, 10, '2013-02-01','2013-02-28' union
select 2, 1, '2013-02-01','2013-02-28'


select  
	date_sales
	,summa as ss
	,summa * (case when id_k=1 then summ_k else 0 end) as sum_k1
	,summa * (case when id_k=2 then summ_k else 0 end)  as sum_k2
from
	Sales as s left join Sales_koef2 as k on s.date_sales between [date_begin] and [date_end]



а если надеемся, что заказчик не передумает, то мой вариант тоже подходит?
4 окт 13, 15:53    [14924913]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

Откуда:
Сообщений: 67
и надо будет каждой год вводить коэффиценты заново?
4 окт 13, 15:54    [14924927]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlexBra
и надо будет каждой год вводить коэффиценты заново?

Мда.
Зачем вводить заново, если коэффициент действует ?
У вас там что, не планируется менять коэффициенты никогда ?
4 окт 13, 15:57    [14924953]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

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

еще раз
к1 : действует каждый январь, февраль, август
к2: действует каждый январь, март, август, декабрь

т.е. есть разрывы между месяцами
если я ввожу периоды (с годом), то нужно добавлять строки декабрь2012, декабрь2013, декабрь2014. и мне как-то это не кажется разумным
4 окт 13, 16:05    [14925003]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlexBra
к1 : действует каждый январь, февраль, август

До скончания веков что ли ?
4 окт 13, 16:06    [14925011]     Ответить | Цитировать Сообщить модератору
 Re: Правильное хранение данных по месячно  [new]
AlexBra
Member

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

(*задумчиво*)
ну да, если отменят, то получается (при удалении записи) за старые периоды пересчет пойдет

ок, спасибо!
4 окт 13, 16:15    [14925073]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить