2015-12-15 3 views
0

Я пытаюсь запустить запрос, чтобы отображать максимальные и минимальные значения из таблицы, называемой продуктом, в соответствии с датой из другой таблицы, называемой pro_details. В запросе должны отображаться наиболее покупаемые продукты той конкретной даты, а также наименее приобретенный продукт. Однако в запросе не отображается запись за данный месяц, даже когда фактическая дата существует!Высокие и низкие значения sql

SELECT 
    Prod.delivered, MIN(quality) Low, MAX(quality) High 
FROM 
    pro_details prod, products pro 
WHERE 
    pro.ord = pro.ord 
    AND Prod.delivered = TO_DATE('12-2015','mm-yyyy') 
GROUP BY 
    Prod.delivered 
ORDER BY 
    Prod.delivered DESC; 
+2

[Плохие привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10 /08/bad-habits-to-kick-using-old-style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** Стандарт SQL (** более 20 лет ** назад) и его использование не рекомендуется –

+0

Какая СУБД вы используете? Postgres? Oracle? –

+0

СУБД Я использую Oracle – Max

ответ

0

Вы пропустили «D» рядом, где положение, а также необходимо преобразовать доставленное поле в формат строки «mm-yyyy». Попробуйте это:

SELECT Prod.delivered, MIN(quality) Low, MAX(quality) High 
FROM pro_details prod, products pro 
WHERE prod.ord = pro.ord 
AND TO_CHAR(Prod.delivered,'mm-yyyy') = '12-2015' 
GROUP BY Prod.delivered 
ORDER BY Prod.delivered DESC; 

Пересмотренный запрос:

SELECT pro.ord, quality 
from pro_details prod, products pro 
where prod.ord = pro.ord 
AND TO_CHAR(Prod.delivered,'mm-yyyy') = '12-2015' 
GROUP BY pro.ord, quality 
having quality=min(quality) or quality=max(quality) 
+0

Благодарим вас за ответ Dan. Мое намерение состоит в том, чтобы показать самый популярный продукт, проданный месяц-месяц, и наименее проданный в том же месяце. – Max

+0

@Max Я не думаю, что исходный запрос может определить ваше намерение. Я пересматриваю другой запрос для вашей справки. –

0

даты SQL сравнения точное. Если вы укажете только месяц и год в дате, сравнение предполагает, что вы хотите использовать нули для всех остальных компонентов в значении DateTime. Вы делаете точное сравнение для записей, датированных только в первый момент месяца.

Если вы хотите весь месяц, вам нужно проверить весь диапазон, от начала месяца до конца месяца:

SELECT Prod.delivered, MIN(quality) Low, MAX(quality) High 
FROM pro_details prod, products pro 
WHERE pro.ord = pro.ord 
    AND Prod.delivered >= TO_DATE('12-2015','mm-yyyy') 
    AND Prod.delivered < TO_DATE('01-2016','mm-yyyy') 
GROUP BY Prod.delivered 
ORDER BY Prod.delivered DESC; 
+0

Спасибо за ответ. Мое намерение состоит в том, чтобы показать самый популярный продукт, проданный месяц-месяц, и наименее проданный в том же месяце. Скажем, я продал 10 продуктов 8 с номером продукта 555 и только два продукта с номером 111! Как показать результаты, поскольку наиболее проданные - 555, а количество продаж 8 в то время как 111 с только 2 как количество продаж – Max