Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть таблица выданных материалов вида id_записи | дата_выдачи | название_материала | количество_выданного Соответственно, один и тот же материал может быть выдан несколько раз, как в разные, так и в одну и ту же дату. Нужно сделать выборку неповторяющихся материалов с суммой выданного. Т.е., если есть строки: 1 | 2017-12-01 | лампочка | 10 2 | 2017-12-02 | лампочка | 10 3 | 2017-12-03 | лампочка | 5 4 | 2017-12-03 | патрон | 10 5 | 2017-12-04 | патрон | 5 в выборке нужно получить лампочка | 25 патрон | 15 Проблему отбора неповторяющихся записей решит DISTINCT, но как проссумировать количество выданного??? Заранее, спасибо за любую подсказку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 10:06 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
GROUP BY + SUM() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 10:22 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
AkinaGROUP BY + SUM() Да, это работает. Спасибо. Полагал, дальше сам додумаю, но возможно моя задача вообще нерешима средствами SQL. Помимо вышеуказанной, у меня есть ещё таблица использованных материалов практически такого же вида: id_записи | дата_использования | название_материала | количество_использованного Количество строк на один и тот же материал в этих таблицах может отличаться. Может быть выдано 50 лампочек, а использованы они могут быть за 5-ть дней по 10-ть штук. Или наоборот, выдаётся 5-ть раз по 10-ть лампочек, а используются они за один день все 50. Мне нужно выбрать те материалы из таблицы выданных, которые ещё не все использованы. Т.е., если, наряду с вышеприведённой таблицей выданных материалов, в таблице использованных будет запись: 1 | 2017-12-04 | лампочка | 20 2 | 2017-12-07 | патрон | 15 то "патрон" в выборке быть не должен, а "лампочка" должна. Возможен такой запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:46 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
Ну та соедини эти таблицы по товару с лефтджоином по выданным(дабы попали те, где использованно 0) и отфильтруй по выдано<использованно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:54 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
sum(выдано)>sum(использованно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 11:56 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
Да это понятно, что нужно сравнить выданное с использованным ) Вот такой запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. выводит таблицу на скрине. Понятно, что программно можно уже отсечь строки, где `ispolzovano`=NULL (или 0) и провести сравнение `vidano`>`ispolzovano`, не выводя строки с результатом false. (это, в принципе, уже устраивает). Но хотелось бы сделать это на уровне SQL. Как отсекать из выборки строку, если в ней `vidano`=`ispolzovano`? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 12:19 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
Должно быть что-то вроде Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 13:20 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
А зачем предварительно группировать? having sum(Выдача.Количество) > sum(Расход.Количество) должно сработать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 14:10 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
having sum(ТаблицаВыдачи.Количество) > sum(ТаблицаРасхода.Количество) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 14:50 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
DozentosКак отсекать из выборки строку, если в ней `vidano`=`ispolzovano`? Кстати, у Вас точно в таблице расходованного количество правильно считается? Не получится ли так, чно 1 декабря выдано 1 штука, 2 декабря выдано 1 штука, 3 декабря расходовано 3 штуки , 4 декабря выдана 1 штука. Количество совпало , Вы такую строку пропускаете... DozentosСоответственно, один и тот же материал может быть выдан несколько раз, как в разные, так и в одну и ту же дату. Нужно сделать выборку неповторяющихся материалов с суммой выданного. Т.е., если есть строки: 1 | 2017-12-01 | лампочка | 10 2 | 2017-12-02 | лампочка | 10 3 | 2017-12-03 | лампочка | 5 4 | 2017-12-03 | патрон | 10 5 | 2017-12-04 | патрон | 5 в выборке нужно получить лампочка | 25 патрон | 15 Сделайте таблицу по пересечению даты, товара и столбцы "пришло шт", "расходовано шт", "остаток на конец дня шт". И пересчитывайте. Как только получите строки с отрицательными "остаток на конец дня шт" - тоже смотрите и исследуйте. Не обязательно хранить на каждый день, достаточно на даты для товаров, когда количество остатка может поменять, то есть, разреженная таблица. И тогда у Вас запрос будет из 2 частей. select from расход group by товар having sum(выдано)<>sum(расходовано) union all select from расход inner join (select count(*) as count_bad from остатки_на_конец_дня where остаток<0 group by товар) group by товар. SQL код писать лениво, думаю, Вы основную мою мысль уловили... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2017, 19:51 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
AkinaДолжно быть что-то вроде Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. вот этот вариант, с незначительными правками, рабочий!!! Спасибо! Вариант Andy_OLAP "1 декабря выдано 1 штука, 2 декабря выдано 1 штука, 3 декабря расходовано 3 штуки, 4 декабря выдана 1 штука. Количество совпало" невозможен. Стоит программная проверка на количество выданного и невозможно израсходовать больше, чем выдано. Изменения кода Akina вызваны только тем, что у меня в таблицах всё несколько сложнее, чем я тут описал (материалы выдаются по определённым договорам, для выполнения определённых видов работ). А в рамках описанной здесь задачи его запрос 100% рабочий! Так что, спасибо всем за участие и подсказки. Akina спасибо отдельное. Тему можно считать закрытой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 09:02 |
|
||
|
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
|
|||
|---|---|---|---|
|
#18+
982183зачем предварительно группировать? Код: sql 1. должно сработатьСтандартная проблема - кратное увеличение числа записей при связывании по неуникальному полю. Три прихода, два расхода, а после связывания перед группировкой это превратится в шесть записей, и вместо осмысленной суммы получим цену на рис в Китае... да плюс кратное количество записей для группировки, которые надо предварительно материализовать - если таблицы пухлые, так может и ресурсов не хватить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2017, 09:12 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39575983&tid=1830153]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 372ms |

| 0 / 0 |
