SELECT COMPANY.NAME, GOODS.NAME, SUM(SHIPMENT.QUANTITY), max(SHIPMENT.SHIPDATE)
FROM COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
GROUP BY COMPANY.NAME, GOODS.NAME
Вывести общий объем поставок с указанием даты последней поставки .
даты последней поставки
Я СДЕЛАЛ ВОТ ТАК :
SELECT COMPANY.NAME, GOODS.NAME, SUM(SHIPMENT.QUANTITY), SHIPMENT.SHIPDATE
FROM COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
GROUP BY GOODS.NAME
НО ТАК ВЫВОДИТ НЕ ПОСЛЕДНЮЮ ДАТУ
КАК ПЕРЕДЕЛАТЬ ЗАПРОС.ДУМАЮ НАДО ИСПОЛЬЗОВАТЬ ФУНКЦИИ ДЛЯ РАБОТЫ ДАТОЙ НО ИХ СТОЛЬКО КАКУЮ ВЫБРАТЬ И КУДА ПРИДЕЛАТЬ НЕ МОГУ ОПРЕДЕЛИТЬ
COMPANY
===============
COMPID | NAME
==============
GOODS
==============
GOODID | NAME
==============
SHIPMENT
========================================
SHIPID | COMPID | GOODID | QUANTITY | SHIPDATE |
========================================
А вообще, наверное надо агрегатную функцию max к дате прменить, т.е.
Код:
Спасибо за подсказку - помогло.Вам от меня +1 по звездочке
в этом виде запрос рабочий в с100% случаев, но если вы добавите еще какое-то поле, которое отсутсвует в group by или агргатинвной ф-ции, и значение этого поля не одинаково для всей группы, то не факт что оно будет правильным
то есть если добавлю например поле TYPE которое например показывает растоможен товар или нет и принимает значение 1 или NULL то запрос работать не будет, я правильно вас понял Lone Wolf ?
какого-либо из товаров для компании в этот период отсутствовали, вывести в
столбце объема 'No data'
Я сделал вот так но не могу вывести значение 'No data'.Для этого запроса надо какую то специальную конструкцию?
SELECT COMPANY.NAME, GOODS.NAME, SUM(SHIPMENT.QUANTITY), MAX(SHIPMENT.SHIPDATE)
FROM COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY)
GROUP BY COMPANY.NAME, GOODS.NAME
"в столбце объема" - это в котором? в сумме я так полагаю? В таком случае, ответ никак. Поясню свою мысль.
У вас столбец суммы числовой а вы туда хотите вывести строку.
Выхода два, первый - столбец суммы преобразовать к тексту (бредовая затея, ибо как только начнут появляться дробные числа, будете испытывать нехилый батхёрт со стороны региональных настроек клиентов), второй - вместо значения 'No data' - выводить например NULL или -1, а подстановкой вместо нулла No data - заниматься на клиенте (здравая мысль, ибо сервер выдает ответ на запрос, а интерпретацией результатов должен заниматься клиент).
Что касается того, как проверить на определенное значение столбец - то есть специальные функции, например CASE, ISNULL, NULLIF. Т.к. вы не озвучили СУБД не могу сказать есть ли таковые в вашей СУБД, но рекомендую погуглить на тему CASE, т.к вроде бы (если мне не изменяет мой маразм) это стандарт ANSI и многие СУБД его поддерживают. В таком случае, запрос выглядит примерно так:
Код:
SELECT
COMPANY.NAME,
GOODS.NAME,
case when SUM(SHIPMENT.QUANTITY) is null then -1 else SUM(SHIPMENT.QUANTITY) end,
MAX(SHIPMENT.SHIPDATE)
FROM
COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE
SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY)
GROUP BY
COMPANY.NAME,
GOODS.NAME
COMPANY.NAME,
GOODS.NAME,
case when SUM(SHIPMENT.QUANTITY) is null then -1 else SUM(SHIPMENT.QUANTITY) end,
MAX(SHIPMENT.SHIPDATE)
FROM
COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE
SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY)
GROUP BY
COMPANY.NAME,
GOODS.NAME
Цитата: SomewherSomehow
Так про БД и не ответили =)
"в столбце объема" - это в котором? в сумме я так полагаю? В таком случае, ответ никак. Поясню свою мысль.
У вас столбец суммы числовой а вы туда хотите вывести строку.
Выхода два, первый - столбец суммы преобразовать к тексту (бредовая затея, ибо как только начнут появляться дробные числа, будете испытывать нехилый батхёрт со стороны региональных настроек клиентов), второй - вместо значения 'No data' - выводить например NULL или -1, а подстановкой вместо нулла No data - заниматься на клиенте (здравая мысль, ибо сервер выдает ответ на запрос, а интерпретацией результатов должен заниматься клиент).
Что касается того, как проверить на определенное значение столбец - то есть специальные функции, например CASE, ISNULL, NULLIF. Т.к. вы не озвучили СУБД не могу сказать есть ли таковые в вашей СУБД, но рекомендую погуглить на тему CASE, т.к вроде бы (если мне не изменяет мой маразм) это стандарт ANSI и многие СУБД его поддерживают. В таком случае, запрос выглядит примерно так:
"в столбце объема" - это в котором? в сумме я так полагаю? В таком случае, ответ никак. Поясню свою мысль.
У вас столбец суммы числовой а вы туда хотите вывести строку.
Выхода два, первый - столбец суммы преобразовать к тексту (бредовая затея, ибо как только начнут появляться дробные числа, будете испытывать нехилый батхёрт со стороны региональных настроек клиентов), второй - вместо значения 'No data' - выводить например NULL или -1, а подстановкой вместо нулла No data - заниматься на клиенте (здравая мысль, ибо сервер выдает ответ на запрос, а интерпретацией результатов должен заниматься клиент).
Что касается того, как проверить на определенное значение столбец - то есть специальные функции, например CASE, ISNULL, NULLIF. Т.к. вы не озвучили СУБД не могу сказать есть ли таковые в вашей СУБД, но рекомендую погуглить на тему CASE, т.к вроде бы (если мне не изменяет мой маразм) это стандарт ANSI и многие СУБД его поддерживают. В таком случае, запрос выглядит примерно так:
Код:
SELECT
COMPANY.NAME,
GOODS.NAME,
case when SUM(SHIPMENT.QUANTITY) is null then -1 else SUM(SHIPMENT.QUANTITY) end,
MAX(SHIPMENT.SHIPDATE)
FROM
COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE
SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY)
GROUP BY
COMPANY.NAME,
GOODS.NAME
COMPANY.NAME,
GOODS.NAME,
case when SUM(SHIPMENT.QUANTITY) is null then -1 else SUM(SHIPMENT.QUANTITY) end,
MAX(SHIPMENT.SHIPDATE)
FROM
COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE
SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY)
GROUP BY
COMPANY.NAME,
GOODS.NAME
Использую Mysql.
Запрос в таком виде просто не выдает инфо по тем компаниям, товарам которые не попали в этот промежуток времени.
Буду читать про функции потока управления программой.
Если вам нужно выводить все, но в сумму включать только те, у которых дата попадает в определнный интервал, просто перенесите условие из where в case и поменяйте местами sum и case.
Т.е.
Код:
select
...
sum(case when SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY) then SHIPMENT.QUANTITY else 0 end)
...
...
sum(case when SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY) then SHIPMENT.QUANTITY else 0 end)
...
SELECT
COMPANY.NAME,
GOODS.NAME,
IFNULL(SUM(SHIPMENT.QUANTITY),'NO DATA'),
MAX(SHIPMENT.SHIPDATE)
FROM
COMPANY
LEFT JOIN SHIPMENT ON COMPANY.COMPID=SHIPMENT.COMPID
LEFT JOIN GOODS ON GOODS.GOODID=SHIPMENT.GOODID
WHERE
SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 340 DAY)
GROUP BY
COMPANY.NAME,
GOODS.NAME
кстати, любопытно, какого типа получилась колонка "IFNULL(SUM(SHIPMENT.QUANTITY),'NO DATA')" в запросе? Если MySQL это схавал, то видимо он сделал неявное преобразование типов, и у вас числа теперь выводятся как строки, имейте ввиду.
Мускл это не схавал вывел тоже самое как и вашем запросе.
Цитата: rafaelkyrdan
Мускл это не схавал вывел тоже самое как и вашем запросе.
Так в итоге непонятно, получилось у вас то что вы хотите или нет? Главным образом непонятно, у вас не получилось вывести заменитель "NO DATA" или вывести те компании и товары у которых нет поставок на определенную дату? И то и то я вам сказал. Для первого вам надо преобразовать все к единому типу, для второго, нужно убрать секцию WHERE и переместить эту условие в агрегатную функцию суммы.
Не получилось вывести "NO DATA" в теч строках где нету поставок на тот период, плюс такие строки вобще не выводит.Если поставить запрос на дату когда нету ни каких поставок то будет 0 строк в результате.Человек который задал этот вопрос мне уверяет что ответ должен быть через IFNULL(SUM(SHIPMENT.QUANTITY),'NO DATA'), но я думаю что он не учел что там разные типы и разсылает задание претендентам сам не решевши его.Если вам интересно могу переслать все задание на почту.
К тому же, у вас уже и так есть вся инфа, чтобы все сделать самому, в том числе и вывести NO DATA (явно преобразуя результаты к одному типу, или неявно если мускуль такое умеет) и вынести условие по дате в агрегирующую функцию, для включение в результат тех записей для которых нет поставок в указанный интервал даты (третий раз уж пишу). Так что, дальше сами, если появятся другие вопросы - милости просим обратно! =)