powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка неповторяющихся записей с подсчётом суммы всех их значений.
12 сообщений из 12, страница 1 из 1
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39575876
Dozentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть таблица выданных материалов вида
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, но как проссумировать количество выданного???
Заранее, спасибо за любую подсказку!
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39575883
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP BY + SUM()
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39575968
Dozentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaGROUP BY + SUM()
Да, это работает. Спасибо.

Полагал, дальше сам додумаю, но возможно моя задача вообще нерешима средствами SQL.
Помимо вышеуказанной, у меня есть ещё таблица использованных материалов практически такого же вида:
id_записи | дата_использования | название_материала | количество_использованного

Количество строк на один и тот же материал в этих таблицах может отличаться. Может быть выдано 50 лампочек, а использованы они могут быть за 5-ть дней по 10-ть штук. Или наоборот, выдаётся 5-ть раз по 10-ть лампочек, а используются они за один день все 50.

Мне нужно выбрать те материалы из таблицы выданных, которые ещё не все использованы. Т.е., если, наряду с вышеприведённой таблицей выданных материалов, в таблице использованных будет запись:
1 | 2017-12-04 | лампочка | 20
2 | 2017-12-07 | патрон | 15
то "патрон" в выборке быть не должен, а "лампочка" должна.

Возможен такой запрос?
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39575983
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну та соедини эти таблицы по товару с лефтджоином по выданным(дабы попали те, где использованно 0)
и отфильтруй по выдано<использованно
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39575986
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sum(выдано)>sum(использованно)
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576006
Dozentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да это понятно, что нужно сравнить выданное с использованным )
Вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
    `название_материала`,
    `id_материала` AS `iden`,
    SUM(`количество_выданного`) AS `vidano`,
    (SELECT SUM(`количество_использованного`) FROM `использованные_материалы` WHERE dog_id='121-17' && m_id=iden) AS `ispolzovano`
FROM `выданные_материалы`
WHERE dog_id='121-17'
GROUP BY mat_id


выводит таблицу на скрине.
Понятно, что программно можно уже отсечь строки, где `ispolzovano`=NULL (или 0) и провести сравнение `vidano`>`ispolzovano`, не выводя строки с результатом false. (это, в принципе, уже устраивает).
Но хотелось бы сделать это на уровне SQL. Как отсекать из выборки строку, если в ней `vidano`=`ispolzovano`?
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576057
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должно быть что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT Выдача.Материал, Выдача.Количество - Расход.Количество AS Остаток
FROM      ( SELECT Материал, SUM(Количество) Количество
            FROM ТаблицаВыдачи
            GROUP BY Материал) AS Выдача
LEFT JOIN ( SELECT Материал, SUM(Количество) Количество
            FROM ТаблицаРасхода
            GROUP BY Материал) AS Расход
     ON Выдача.Материал = Расход.Материал
WHERE Выдача.Количество > Расход.Количество
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576114
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем предварительно группировать?
having sum(Выдача.Количество) > sum(Расход.Количество)
должно сработать
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576161
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
having sum(ТаблицаВыдачи.Количество) > sum(ТаблицаРасхода.Количество)
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576389
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 код писать лениво, думаю, Вы основную мою мысль уловили...
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576526
Dozentos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaДолжно быть что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT Выдача.Материал, Выдача.Количество - Расход.Количество AS Остаток
FROM      ( SELECT Материал, SUM(Количество) Количество
            FROM ТаблицаВыдачи
            GROUP BY Материал) AS Выдача
LEFT JOIN ( SELECT Материал, SUM(Количество) Количество
            FROM ТаблицаРасхода
            GROUP BY Материал) AS Расход
     ON Выдача.Материал = Расход.Материал
WHERE Выдача.Количество > Расход.Количество


вот этот вариант, с незначительными правками, рабочий!!! Спасибо!

Вариант Andy_OLAP "1 декабря выдано 1 штука, 2 декабря выдано 1 штука, 3 декабря расходовано 3 штуки, 4 декабря выдана 1 штука. Количество совпало" невозможен. Стоит программная проверка на количество выданного и невозможно израсходовать больше, чем выдано. Изменения кода Akina вызваны только тем, что у меня в таблицах всё несколько сложнее, чем я тут описал (материалы выдаются по определённым договорам, для выполнения определённых видов работ). А в рамках описанной здесь задачи его запрос 100% рабочий!
Так что, спасибо всем за участие и подсказки. Akina спасибо отдельное.
Тему можно считать закрытой.
...
Рейтинг: 0 / 0
Выборка неповторяющихся записей с подсчётом суммы всех их значений.
    #39576530
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183зачем предварительно группировать?
Код: sql
1.
having sum(Выдача.Количество) > sum(Расход.Количество)


должно сработатьСтандартная проблема - кратное увеличение числа записей при связывании по неуникальному полю. Три прихода, два расхода, а после связывания перед группировкой это превратится в шесть записей, и вместо осмысленной суммы получим цену на рис в Китае... да плюс кратное количество записей для группировки, которые надо предварительно материализовать - если таблицы пухлые, так может и ресурсов не хватить...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка неповторяющихся записей с подсчётом суммы всех их значений.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]