Суммирование строк с уникальным значением поля

отредактировано March 2013 Раздел: FastReport 4.0
В 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 мало знаком. Кто знает - подскажите пожалуйста.

Комментарии

  • отредактировано 10:53
    дошел до такого

    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
  • отредактировано 10:53
    vladgunich написал: »
    дошел до такого

    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.
  • отредактировано March 2013
    Nadya_rus написал: »
    Ошибку выдает по причине, что в GROUP BY должны быть перечислены все поля запроса, кроме агрегатных функций, то есть в вашем случае
    GROUP BY t.hwid, h.invoicen, h.invoiced, t.modeln,t.modelid, a.apvalue1,t.amodeln.

    Спасибо, действительно, ошибка исчезла. Только запрос не работает - выбрал два одинаковых устройства, они все равно в разных строках вывелись...
  • отредактировано March 2013
    vladgunich написал: »
    Спасибо, действительно, ошибка исчезла. Только запрос не работает - выбрал два одинаковых устройства, они все равно в разных строках вывелись...
    Значит результат набора указанных полей не уникален. Выясните по результату запроса, какое поле (или поля) (значение его) не уникально. В зависимости от того какое поле (его значение) дублируется надо принимать решение (1. возможно данные таблиц не верные - если это справочники, и повторения теотетически не должно быть. 2. если все же с данными все в порядке, то анализируйте, как вы себе представляете повторение этого дублирования в отчете и отсюда "пляшите").
  • отредактировано 10:53
    Nadya_rus написал: »
    Значит результат набора указанных полей не уникален. Выясните по результату запроса, какое поле (или поля) (значение его) не уникально и выводите в подзапрос.

    ну выяснить какое поле не уникально я еще смогу, а вот как строятся подзапросы это слишком сложно для меня))
  • отредактировано 10:53
    vladgunich написал: »
    ну выяснить какое поле не уникально я еще смогу
    Вот и определите это поле, и задайтесь вопросом, почему оно не уникально для одной и той же модели? Допустимо ли это? Возможно, ответив на эти вопросы, вы и найдете окончательное решение.
    К примеру, если это поле наименование, то, возможно, это поле не так уж и важно для вашего отчета, то удалите его из запроса и будет вам уникальность.
  • отредактировано 10:53
    Nadya_rus написал: »
    Вот и определите это поле, и задайтесь вопросом, почему оно не уникально для одной и той же модели? Допустимо ли это? Возможно, ответив на эти вопросы, вы и найдете окончательное решение.
    К примеру, если это поле наименование, то, возможно, это поле не так уж и важно для вашего отчета, то удалите его из запроса и будет вам уникальность.

    результат запроса у меня выводится в таблицу по столбцам - наименование, номер и дата накладной, количество, цена, размер и вес. Если я удалю к примеру из запроса наименование, то я так понимаю что и вывести в таблицу я его не смогу, так?
  • отредактировано 10:53
    Я сейчас попробовал убрать из запроса t.hwid и вроде заработало - во всяком случае вывелась одна строка (одинаковых устройств было выбрано два). Теперь осталось придумать как правильно выводить информацию о количестве и сумме. До этого выводилось с помощью [AdoQuery1."t.count"]
  • отредактировано 10:53
    vladgunich написал: »
    Я сейчас попробовал убрать из запроса t.hwid и вроде заработало - во всяком случае вывелась одна строка (одинаковых устройств было выбрано два). Теперь осталось придумать как правильно выводить информацию о количестве и сумме. До этого выводилось с помощью [AdoQuery1."t.count"]
    Вы написали, что hwid - паспорт(уникальное для каждого устройства). Возникает вопрос в таком случае - как это получается, что у вас было 2 записи с одним и тем же hwid? Тут напрашивается 2 варианта, которые надо уточнить - проверьте записи в таблице tmp, там что физически сидят 2 одинаковые записи с уникальным ключом??? Если да, то не морочьте голову, проблема не в запросе, а в базе данных. Если нет, то второе надо проверить - как должны быть связаны между собой эти три таблицы? Похоже вы не правильно определили уникальность соединения, отсюда и дублирование. (А t.hwid убирать из запроса не рекомендую в конечном итоге. Если это уникальное поле, как вы говорите, то, убирая его из запроса, вы уводите себя дальше от выяснения истинной причины вашей проблемы.
  • отредактировано 10:53
    Странно..но поле t.hwid это уникальное поле, это четырехзначный номер, который автоматически присваивается программой любому устройству в базе.
    вот таблицы и связи между ними
  • отредактировано 10:53
    vladgunich написал: »
    Странно..но поле t.hwid это уникальное поле, это четырехзначный номер, который автоматически присваивается программой любому устройству в базе.
    Странно то странно, но Вы же сами сказали, что у вас в результате отчета повторился t.hwid. Отсюда и советы были. Вы выполнили совет номер 1, или сразу приступили к совету номер 2 и шлете тут рисунки связей??? Связи, как я поняла для этого отчета, а не реляционнные связи САМИХ таблиц, так? Если отчета, то эти ваши файлы не имело смысла присылать. Прочтите мое предыдущее сообщение внимательнее и выполните последовательно, как написала.
  • отредактировано 10:53
    Nadya_rus написал: »
    Странно то странно, но Вы же сами сказали, что у вас в результате отчета повторился t.hwid. Отсюда и советы были. Вы выполнили совет номер 1, или сразу приступили к совету номер 2 и шлете тут рисунки связей??? Связи, как я поняла для этого отчета, а не реляционнные связи САМИХ таблиц, так? Если отчета, то эти ваши файлы не имело смысла присылать. Прочтите мое предыдущее сообщение внимательнее и выполните последовательно, как написала.

    я выполнил совет 1 и убедился что поле hwid уникальное, и у каждого устройства это значение уникальное. Насчет второго совета - да, скорей всего я не так понял и прислал связи для отчета, а где я могу посмотреть связи самих таблиц? Сам я их не связывал. Fast Report запускаю из сторонней программы, с помощью которой ведется учет оборудования. Возможно ли такое, что разработчики этой программы определили соединения таким образом, что это влияет на построение запроса?
  • отредактировано 10:53
    vladgunich написал: »
    я выполнил совет 1 и убедился что поле hwid уникальное, и у каждого устройства это значение уникальное.
    Прочтите, пожалуйста, весь наш диалог (все сообщения), а вернее ваши соощения - вы сами противоречите себе. В последнем написали, что уникально, а ранее написали "Я сейчас попробовал убрать из запроса t.hwid и вроде заработало - во всяком случае вывелась одна строка (одинаковых устройств было выбрано два). ". С такой противоречивой информацией помочь вам просто невозможно. Изивините, а правда старалась. :)
    Возможно, если вы без спешки вновь пройдетесь по всем моим ответам, вы поймете суть. Поскольку пока на данном этапе, вы не видите полную картину вашей задачи.
  • отредактировано 10:53
    Nadya_rus написал: »
    Прочтите, пожалуйста, весь наш диалог (все сообщения), а вернее ваши соощения - вы сами противоречите себе. В последнем написали, что уникально, а ранее написали "Я сейчас попробовал убрать из запроса t.hwid и вроде заработало - во всяком случае вывелась одна строка (одинаковых устройств было выбрано два). ". С такой противоречивой информацией помочь вам просто невозможно. Изивините, а правда старалась. :)
    Возможно, если вы без спешки вновь пройдетесь по всем моим ответам, вы поймете суть. Поскольку пока на данном этапе, вы не видите полную картину вашей задачи.

    да вам спасибо большое за советы, но в чем я противоречу сам себе я не знаю, в каждом сообщении я описывал свои действия и результат, к которому это приводило. насчет поля hwid я уверен на 100% что оно уникальное, и обозначает код устройства или паспорт устройства, неважно, суть одна - это четырехзначный номер, который не повторяется. я действительно убирал из запроса это поле, и не было никаких ошибок, но насчет правильности вывода результата могу сказать что запрос работал неверно, как я потом увидел, протестировав на разных наборах и моделях устройств. Вся сложность в том, что помимо моих слабых знаний SQL, скелет запроса делался до меня другим человеком, наверное проще мне попробовать все сделать с нуля, чем разбираться в этом дальше. Вам спасибо еще раз за терпение и помощь)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.