Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6317
Последний выпуск: 19.06.2015

Вывести общий объем поставок с указанием даты последней поставки .

23K
21 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Вывести общий объем поставок каждого из продуктов для каждой фирмы с указанием
даты последней поставки

Я СДЕЛАЛ ВОТ ТАК :

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

НО ТАК ВЫВОДИТ НЕ ПОСЛЕДНЮЮ ДАТУ
КАК ПЕРЕДЕЛАТЬ ЗАПРОС.ДУМАЮ НАДО ИСПОЛЬЗОВАТЬ ФУНКЦИИ ДЛЯ РАБОТЫ ДАТОЙ НО ИХ СТОЛЬКО КАКУЮ ВЫБРАТЬ И КУДА ПРИДЕЛАТЬ НЕ МОГУ ОПРЕДЕЛИТЬ
23K
21 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
СТРУКТУРА ТАБЛИЦ

COMPANY
===============
COMPID | NAME
==============

GOODS
==============
GOODID | NAME
==============

SHIPMENT
========================================
SHIPID | COMPID | GOODID | QUANTITY | SHIPDATE |
========================================
385
21 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
КАКАЯ БАЗА ДАННЫХ?????

А вообще, наверное надо агрегатную функцию max к дате прменить, т.е.

 
Код:
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
23K
22 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Спасибо за подсказку - помогло.Вам от меня +1 по звездочке
274
22 октября 2011 года
Lone Wolf
1.3K / / 26.11.2006
Только учтите, что добавлять еще какие-то поля в выдачу нельзя,.
в этом виде запрос рабочий в с100% случаев, но если вы добавите еще какое-то поле, которое отсутсвует в group by или агргатинвной ф-ции, и значение этого поля не одинаково для всей группы, то не факт что оно будет правильным
23K
22 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
то есть если добавлю например поле TYPE которое например показывает растоможен товар или нет и принимает значение 1 или NULL то запрос работать не будет, я правильно вас понял Lone Wolf ?
23K
22 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Аналогично предыдущему запросу, но за последние 60 дней. Если поставки
какого-либо из товаров для компании в этот период отсутствовали, вывести в
столбце объема '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
385
22 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
Так про БД и не ответили =)
"в столбце объема" - это в котором? в сумме я так полагаю? В таком случае, ответ никак. Поясню свою мысль.
У вас столбец суммы числовой а вы туда хотите вывести строку.
Выхода два, первый - столбец суммы преобразовать к тексту (бредовая затея, ибо как только начнут появляться дробные числа, будете испытывать нехилый батхёрт со стороны региональных настроек клиентов), второй - вместо значения '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
23K
22 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Цитата: SomewherSomehow
Так про БД и не ответили =)
"в столбце объема" - это в котором? в сумме я так полагаю? В таком случае, ответ никак. Поясню свою мысль.
У вас столбец суммы числовой а вы туда хотите вывести строку.
Выхода два, первый - столбец суммы преобразовать к тексту (бредовая затея, ибо как только начнут появляться дробные числа, будете испытывать нехилый батхёрт со стороны региональных настроек клиентов), второй - вместо значения '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



Использую Mysql.
Запрос в таком виде просто не выдает инфо по тем компаниям, товарам которые не попали в этот промежуток времени.
Буду читать про функции потока управления программой.

385
24 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
А вам разве не это нужно было?
Если вам нужно выводить все, но в сумму включать только те, у которых дата попадает в определнный интервал, просто перенесите условие из where в case и поменяйте местами sum и case.
Т.е.
 
Код:
select
        ...
        sum(case when SHIPMENT.SHIPDATE > DATE_SUB(CURDATE(),INTERVAL 360 DAY) then SHIPMENT.QUANTITY else 0 end)
...
23K
25 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
С ПОМОЩЬЮ УЧЕБНИКОВ ВОТ ТАКОЙ ЗАПРОС ПОЛУЧИЛСЯ:

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
385
25 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
Дык вроде вас не устраивало то, что в результатах не выводятся те товары и компании для которых нет поставок попадающих в интервал по дате?

кстати, любопытно, какого типа получилась колонка "IFNULL(SUM(SHIPMENT.QUANTITY),'NO DATA')" в запросе? Если MySQL это схавал, то видимо он сделал неявное преобразование типов, и у вас числа теперь выводятся как строки, имейте ввиду.
23K
25 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Мускл это не схавал вывел тоже самое как и вашем запросе.
385
26 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
Цитата: rafaelkyrdan
Мускл это не схавал вывел тоже самое как и вашем запросе.



Так в итоге непонятно, получилось у вас то что вы хотите или нет? Главным образом непонятно, у вас не получилось вывести заменитель "NO DATA" или вывести те компании и товары у которых нет поставок на определенную дату? И то и то я вам сказал. Для первого вам надо преобразовать все к единому типу, для второго, нужно убрать секцию WHERE и переместить эту условие в агрегатную функцию суммы.

23K
26 октября 2011 года
rafaelkyrdan
123 / / 03.05.2011
Не получилось вывести "NO DATA" в теч строках где нету поставок на тот период, плюс такие строки вобще не выводит.Если поставить запрос на дату когда нету ни каких поставок то будет 0 строк в результате.Человек который задал этот вопрос мне уверяет что ответ должен быть через IFNULL(SUM(SHIPMENT.QUANTITY),'NO DATA'), но я думаю что он не учел что там разные типы и разсылает задание претендентам сам не решевши его.Если вам интересно могу переслать все задание на почту.
385
26 октября 2011 года
SomewherSomehow
477 / / 25.07.2004
Нет, спасибо, подобные тестовые задачки мне решать неинтересно, да тут в общем-то и решать особо нечего.
К тому же, у вас уже и так есть вся инфа, чтобы все сделать самому, в том числе и вывести NO DATA (явно преобразуя результаты к одному типу, или неявно если мускуль такое умеет) и вынести условие по дате в агрегирующую функцию, для включение в результат тех записей для которых нет поставок в указанный интервал даты (третий раз уж пишу). Так что, дальше сами, если появятся другие вопросы - милости просим обратно! =)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог