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

Откуда: Москва
Сообщений: 558
Итак есть данные
Ключь1, Ключь2, Дата начала, Дата окончания, Сумма
А1|В1|01/01/2016|01/03/2016|300
А2|В1|01/01/2016|01/03/2016|500

Надо каждую строчку поделить на несколько пропорционально количеству месяцев, и проставить дату
c 01/01/2016 по 01/03/2016 3 месяца (тут просто DATEDIFF)

А1|В1|01/01/2016|100
А1|В1|01/02/2016|100
А1|В1|01/03/2016|100

Вот что-то мне навивает Union с таблицей в которой будут все первые числа месяца за все годы (ну ясно какой-то огранченный интервал) .. может есть решение красивее?
14 апр 16, 15:30    [19057073]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строчку на несколько  [new]
Glory
Member

Откуда:
Сообщений: 104751
Masygreen
Вот что-то мне навивает Union с таблицей в которой будут все первые числа месяца за все годы (ну ясно какой-то огранченный интервал) .. может есть решение красивее?

Не Union а Join. И не первые числа месяцов, а просто числа
14 апр 16, 15:34    [19057092]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строчку на несколько  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Если всегда будут первые числа месяцев, то можно к примеру так:

DECLARE @t TABLE (
    key1 NVARCHAR(50),
    key2 NVARCHAR(50),
    date_s DATE,
    date_e DATE,
    val INT
)

INSERT INTO @t
VALUES
    (N'А1', N'В1', '20160101', '20160301', 300),
    (N'А2', N'В1', '20160101', '20160501', 500)

SELECT
    key1,
    key2,
    DATEADD(MONTH, t.number, date_s),
    val = val * 1. / DATEDIFF(MONTH, date_s, date_e)
FROM @t
JOIN [master].dbo.spt_values t ON t.number BETWEEN 0 AND DATEDIFF(MONTH, date_s, date_e)
WHERE t.[type] = 'P'
14 апр 16, 15:39    [19057113]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строчку на несколько  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
AlanDenton,
сказочно круто .. ни фига не понял, но круто ))
14 апр 16, 15:51    [19057178]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строчку на несколько  [new]
Masygreen
Member

Откуда: Москва
Сообщений: 558
Только DATEDIFF(MONTH, date_s, date_e)+1 иначе деление на 0 если даты одного месяца
14 апр 16, 16:11    [19057357]     Ответить | Цитировать Сообщить модератору
 Re: Разбить строчку на несколько  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Верное замечание... можно вот так подправить к примеру:

val = val * 1. / ISNULL(NULLIF(DATEDIFF(MONTH, date_s, date_e), 0), 1)
14 апр 16, 16:14    [19057399]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить