Как получить максимальный ряд из таблицы - PullRequest
1 голос
/ 19 апреля 2010

HI

У меня следующий код и серьезная проблема:

WITH CALC1 AS (
SELECT OTQUOT, OTIT01 AS ITEMS, ROUND(OQCQ01 * OVRC01,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT01 <> ''

UNION ALL

SELECT OTQUOT, OTIT02 AS ITEMS, ROUND(OQCQ02 * OVRC02,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT02 <> ''

UNION ALL

SELECT OTQUOT, OTIT03 AS ITEMS, ROUND(OQCQ03 * OVRC03,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT03 <> ''

UNION ALL

SELECT OTQUOT, OTIT04 AS ITEMS, ROUND(OQCQ04 * OVRC04,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT04 <> ''

UNION ALL

SELECT OTQUOT, OTIT05 AS ITEMS, ROUND(OQCQ05 * OVRC05,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT05 <> ''

ORDER BY OTQUOT ASC
)

SELECT OTQUOT, ITEMS, MAX(COST)
FROM CALC1
WHERE OTQUOT = '04886471'
GROUP BY OTQUOT, ITEMS

результат:

 04886471 FEPO5050WCGA24 13.21
 04886471 GFRK1650SGL 36.21
 04886471 FRA7500GA 12.6
 04886471 CGIFESHAZ 11.02
 04886471 CGIFESHPDPR 11.79
 04886471 GFRK1350DBL 68.23
 04886471 RET1.63825GP 32.55
 04886471 FRSA 0.12
 04886471 GFRK1350SGL 55.94
 04886471 GFRK1650DBL 71.89
 04886471 FEPO6565WCGA24 16.6
 04886471 PCAP5050GA 0.28
 04886471 FEPO6565NCPAG24 0.000000

Как я могу получить результат строки с кодом товара, который имеет наибольшее значение? В этом случае мне нужен результат: 04886471 GFRK1650DBL 71,89 но я не знаю, как изменить свой код, чтобы получить это - кто-нибудь, пожалуйста, помогите мне?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2010

Используйте оконную функцию ROW_NUMBER(), чтобы обеспечить возможность выбора верхней строки. Обратите внимание, что вам нужно поместить его в производный подзапрос, поскольку предложение WHERE не может ссылаться на собственный номер строки запроса. Вы должны сделать это с помощью внешнего запроса:

WITH ( ...your UNION query... )
SELECT *
FROM (
  SELECT OTQUOT, ITEMS, COST, ROW_NUMBER() OVER (ORDER BY COST DESC) AS RN
  FROM CALC1
  WHERE OTQUOT = '04886471'
) T
WHERE T.RN = 1;

Также я бы не стал беспокоиться о ORDER BY внутри вашего запроса UNION.

1 голос
/ 19 апреля 2010

Добавление ORDER BY COST DESC LIMIT 1 должно помочь, если я правильно понимаю ваш вопрос.

Редактировать : Если в качестве комментария предполагается, что ваш движок SQL не поддерживает LIMIT, см. в этом посте о том, как эмулировать LIMIT с Microsoft SQL Server (также работать в других SQL-совместимых механизмах, таких как Oracle, PostgreSQL или DB2, поскольку он использует только стандартные конструкции SQL).

...