Суммирование строк с уникальным значением поля
В FastReport сделал отчет-накладную на перемещение оборудования.
Поля:
hwid - паспорт(уникальное для каждого устройства)
invoicen - номер накладной
invoiced - дата накладной
modeln - наименование модели
count - количество
modelid - код модели
apvalue1 - доп.параметры устройства
price2 - цена
amodeln - наименование для бухгалтерии
Мой запрос выглядит так:
SELECT t.hwid, h.invoicen, h.invoiced, t.modeln, t.count, t.modelid, a.apvalue1, t.price2, t.amodeln
FROM
tmp t
INNER JOIN hardware h ON (t.hwid=h.hwid)
LEFT OUTER JOIN apmodel a ON (t.modelid=a.modelid)
Если у оборудования разный modelid, то все ок, каждое наименование выводится в отдельной строке.
Хотелось бы сделать так, что если в отчет попадает несколько одинаковых наименований, то есть устройств с одним и тем же modelid, то чтобы они выводились не каждый в отдельную строку, а в одну, и количество ставилось соответствующее. Я так понимаю нужно написать условие и суммирование или какой-то составной запрос, но как правильно не знаю, с SQL мало знаком. Кто знает - подскажите пожалуйста.
Поля:
hwid - паспорт(уникальное для каждого устройства)
invoicen - номер накладной
invoiced - дата накладной
modeln - наименование модели
count - количество
modelid - код модели
apvalue1 - доп.параметры устройства
price2 - цена
amodeln - наименование для бухгалтерии
Мой запрос выглядит так:
SELECT t.hwid, h.invoicen, h.invoiced, t.modeln, t.count, t.modelid, a.apvalue1, t.price2, t.amodeln
FROM
tmp t
INNER JOIN hardware h ON (t.hwid=h.hwid)
LEFT OUTER JOIN apmodel a ON (t.modelid=a.modelid)
Если у оборудования разный modelid, то все ок, каждое наименование выводится в отдельной строке.
Хотелось бы сделать так, что если в отчет попадает несколько одинаковых наименований, то есть устройств с одним и тем же modelid, то чтобы они выводились не каждый в отдельную строку, а в одну, и количество ставилось соответствующее. Я так понимаю нужно написать условие и суммирование или какой-то составной запрос, но как правильно не знаю, с SQL мало знаком. Кто знает - подскажите пожалуйста.
Комментарии
SELECT t.hwid, h.invoicen, h.invoiced, t.modeln,SUM(t.count), t.modelid, a.apvalue1, SUM(t.price2), t.amodeln
FROM
tmp t
INNER JOIN hardware h ON (t.hwid=h.hwid)
LEFT OUTER JOIN apmodel a ON (t.modelid=a.modelid) group by t.modelid
Но выскакивает ошибка SQL: GROUP BY clause is missing or invalid
Ошибку выдает по причине, что в GROUP BY должны быть перечислены все поля запроса, кроме агрегатных функций, то есть в вашем случае
GROUP BY t.hwid, h.invoicen, h.invoiced, t.modeln,t.modelid, a.apvalue1,t.amodeln.
Спасибо, действительно, ошибка исчезла. Только запрос не работает - выбрал два одинаковых устройства, они все равно в разных строках вывелись...
ну выяснить какое поле не уникально я еще смогу, а вот как строятся подзапросы это слишком сложно для меня))
К примеру, если это поле наименование, то, возможно, это поле не так уж и важно для вашего отчета, то удалите его из запроса и будет вам уникальность.
результат запроса у меня выводится в таблицу по столбцам - наименование, номер и дата накладной, количество, цена, размер и вес. Если я удалю к примеру из запроса наименование, то я так понимаю что и вывести в таблицу я его не смогу, так?
вот таблицы и связи между ними
я выполнил совет 1 и убедился что поле hwid уникальное, и у каждого устройства это значение уникальное. Насчет второго совета - да, скорей всего я не так понял и прислал связи для отчета, а где я могу посмотреть связи самих таблиц? Сам я их не связывал. Fast Report запускаю из сторонней программы, с помощью которой ведется учет оборудования. Возможно ли такое, что разработчики этой программы определили соединения таким образом, что это влияет на построение запроса?
Возможно, если вы без спешки вновь пройдетесь по всем моим ответам, вы поймете суть. Поскольку пока на данном этапе, вы не видите полную картину вашей задачи.
да вам спасибо большое за советы, но в чем я противоречу сам себе я не знаю, в каждом сообщении я описывал свои действия и результат, к которому это приводило. насчет поля hwid я уверен на 100% что оно уникальное, и обозначает код устройства или паспорт устройства, неважно, суть одна - это четырехзначный номер, который не повторяется. я действительно убирал из запроса это поле, и не было никаких ошибок, но насчет правильности вывода результата могу сказать что запрос работал неверно, как я потом увидел, протестировав на разных наборах и моделях устройств. Вся сложность в том, что помимо моих слабых знаний SQL, скелет запроса делался до меня другим человеком, наверное проще мне попробовать все сделать с нуля, чем разбираться в этом дальше. Вам спасибо еще раз за терпение и помощь)