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

Откуда:
Сообщений: 142
Здравствуйте, уважаемы коллеги !

Есть таблица с много данных. В ней хранится информация в виде:


ID ID_goal Price Date_


Товаров ровно 4 вставляется каждый раз. Записи выглядят вот так и вставка данных по товарам может быть выполнена несколько раз в день, дата хранится вместе с временем. ID прыгает, нельзя быть уверенной что записи идут по порядку.

25997 1 50 20-12-2016
25998 2 50 20-12-2016
25999 3 50 20-12-2016
259910 4 50 20-12-2016

125997 1 60 20-12-2017
225998 2 70 20-12-2017
325999 3 60 20-12-2017
459910 4 65 20-12-2017

Взять последнюю цену по товарам я могу но как понять, сколько стоил товар в предыдущее время? По-моему, база спроектирована неверно и не хватает еще одного поля, какого-нибудь Id_Insert, где для каждой вставки было бы уникальное значение. Или я ничего не понимаю и можно посчитать и на основе имеющихся данных, но как ?! SQL 2014
29 май 17, 10:48    [20519265]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Добрый Э - Эх
Guest
ElenaTomsk,

очевидно, через LEAD/LAG, раз уж версия 2014...
29 май 17, 10:53    [20519283]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20528
ElenaTomsk
вставка данных по товарам может быть выполнена несколько раз в день, дата хранится вместе с временем.
Дата (что со временем) - это дата ввода записи или дата актуальности (действительности) информации? Если второе - этого достаточно для идентификации исторического порядка, и LEAD/LAG правильно покажет предыдущее значение, если первое - то только при условии, что более поздние по действию записи не могли быть введены ранее более ранних по действию, иначе данных для установления хронологического порядка действия в таблице просто нет.
29 май 17, 11:05    [20519338]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Сумма вычисляется с группировкой по коду товара.
29 май 17, 11:06    [20519340]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
iiyama
Member

Откуда:
Сообщений: 642
ElenaTomsk,
Странно, топике написано сумма, а в содержимом ищется предыдущее значение. Ребус однако
29 май 17, 11:11    [20519368]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

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

Это дата ввода информации. Т.е. если использовать LAG, то можно не переживать по поводу уникального идентификатора именно самого момента обновления данных ? Я ч то хочу получить:

Например, на сегодняшний день сделано три обновления данных. Все эти товары стоил все вместе условно 20 тысяч рублей, 21, 25.

Но как посчитать общую сумму на самом деле? Я не прошу готового решения, только алгоритм !
Что-то вроде

select Lag(price) as p_price, price
where cast(date_ as date) = '05-29-2017'
order by id_goal


и теперь сумму по p_price ?
29 май 17, 11:15    [20519383]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
iiyama
ElenaTomsk,
Странно, топике написано сумма, а в содержимом ищется предыдущее значение. Ребус однако


Извиняюсь, у меня бывают проблемы с формулированием мыслей. Сумма за предыдущий период, как это правильно сказать ?

Сейчас товар на складе на сумму 23 тысячи рублей, а на предыдущий период его же было на 21 тысячу рублей и вот так на каждый момент сохранения данных.
29 май 17, 11:17    [20519390]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Какой прекрасный поток незамутненного сознания. Но увы, из него никак не удается выловить, что же нужно получить...
29 май 17, 11:20    [20519400]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Владислав Колосов
Member

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

Вы же знаете период и код товара, что мешает написать группировку за этот период с вычислением суммы?
29 май 17, 11:22    [20519410]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
iiyama
Member

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

Я кажется догнал, Вам нужен нарастающий итог на дату по каждому товару?
29 май 17, 11:24    [20519421]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Похоже на сумму с нарастающим итогом, вроде
[sum_cur] = SUM( [price] ) OVER ( PARTITION BY ... ORDER BY ... ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
[sum_prev] = SUM( [price] ) OVER ( PARTITION BY ... ORDER BY ... ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING )

за точность не ручаюсь, 2012 под рукой нет...
29 май 17, 11:27    [20519434]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20528
ElenaTomsk
Это дата ввода информации. Т.е. если использовать LAG, то можно не переживать по поводу уникального идентификатора именно самого момента обновления данных ?

В этом случае - ещё как надо! Если ввести дневные данные, а через полчаса утренние - то много чего можно насчитать...
29 май 17, 11:51    [20519523]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

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

Нет, гарантия, что данные вводятся по-порядку есть, их робот вставляет. Но рада встретить одобрение, что я правильно поняла про неверную структуру данных.
29 май 17, 13:02    [20519785]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

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

Скажите, а можно ли как-то автоматически расставить номер обновления, если добавить это поле в таблицу, исправить некорректную структуру ? Это получается: для каждых четырех записей должен быть номер = 1, для следующих четырех номер = номер + 1
для следующих четырех номер = номер + 2 и так далее
Большое спасибо вам за ответы, я еще stackoverflow читаю и там мне очень нравится ваши ответы, если это тоже вы.
29 май 17, 13:17    [20519846]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
Руслан Дамирович,

Спасибо, в том числе и за восхищение моим сознанием, но это не то. Мне нужна сумма за каждый период времени по всем товарам на этот момент. Три раза в день, в 12, 15 и 17 произошло обновление данных. Каждый раз были вставлены записи по четырем товарам.
Нужна общая сумма на 12, на 15 и на 17 часов.
29 май 17, 13:21    [20519862]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Akina
Member

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

Если Вы вводите ценовые параметры, изменяющиеся во времени, то Вы должны фиксировать не время ввода нового значения параметра (его, конечно, тоже можно фиксировать, но оно никому не нужно имхо), а время начала актуальности значения параметра (в данном случае цены). Т.е. Вы должны гарантировать, что за секунду до этой даты-времени была действительна предыдущая согласно таблице цена.
29 май 17, 13:22    [20519868]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20528
ElenaTomsk
Три раза в день, в 12, 15 и 17 произошло обновление данных. Каждый раз были вставлены записи по четырем товарам.
Не думаю, что у Вас есть констрейнт, проверяющий наличие строго 4 записей за один кол времени. А коли так - всегда есть возможность частичной утраты данных в группе, т.е. наличие не 4, а 1, 2 или 3 записей.

ElenaTomsk
Нужна общая сумма на 12, на 15 и на 17 часов.

Ну это группировка по времени и сумма по деньгам, что тут сложного?

ElenaTomsk
можно ли как-то автоматически расставить номер обновления

Да можно, какие собсно проблемы? и заполнить это поле не проблема - получаете список дат-времён, нумеруете его тупо DENSE_RANK-ом при соотв. сортировке, и этим номером обновляете значение поля.
29 май 17, 13:28    [20519894]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ElenaTomsk
Руслан Дамирович,

Спасибо, в том числе и за восхищение моим сознанием, но это не то. Мне нужна сумма за каждый период времени по всем товарам на этот момент. Три раза в день, в 12, 15 и 17 произошло обновление данных. Каждый раз были вставлены записи по четырем товарам.
Нужна общая сумма на 12, на 15 и на 17 часов.

У нас штатные гадалки в отпуска укатили. Все, что мы знаем, что у вас база неправильно спроектирована. А то, что вы нам не можете объяснить, что же вам нужно получить, это проблема коммуникации. Не можете объяснить - рисуйте.
29 май 17, 13:28    [20519895]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

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

Как мне видится, если добавить id_insert, уникальный номер вставки, который будет один и тот же для всех 4 строк вставки, объединять их, то цель будет достигнута. Остается понять, можно ли его сделать одним апдейтом, а не руками.
29 май 17, 13:31    [20519907]     Ответить | Цитировать Сообщить модератору
 Re: Вычислить сумму, если база неверно спроектирована  [new]
ElenaTomsk
Member

Откуда:
Сообщений: 142
ElenaTomsk
можно ли как-то автоматически расставить номер обновления

Да можно, какие собсно проблемы? и заполнить это поле не проблема - получаете список дат-времён, нумеруете его тупо DENSE_RANK-ом при соотв. сортировке, и этим номером обновляете значение поля.[/quot]

да, спасибо большое. Это полностью все решило.
29 май 17, 14:12    [20520044]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить