2014-12-23 3 views
1

Я пытаюсь получить минимальное значение для возврата из функции agregate. Я создал запрос, который выполняется, но не возвращает только одну минимальную строку для каждой группы. В этом примере для каждого prod_num имеется несколько строк, каждый из которых имеет уникальный серийный номер. Это для SQL Server.SQL получение минимального значения из агрегированной функции

Мой код:

SELECT 
    x.prod_num, Min(x.sn) sn, y.qty, x.date_tested,x.scrap 
FROM 
    serial_numbers x 
JOIN 
    prod_ord y on y.prod_num = x.prod_num 
WHERE 
    x.date_tested IS NOT NULL 
    AND x.scrap = 1 
GROUP BY 
    x.prod_num, x.sn, y.qty, x.date_tested, x.scrap 
ORDER BY 
    x.date_tested desc, x.prod_num 

Мои результаты:

prod_num sn   qty date_tested   scrap 
------------------------------------------------------------ 
301336662 120214A10338 7 2014-12-09 19:26:41.650 1 
301336662 120214A10339 7 2014-12-09 19:26:41.650 1 
301336662 120214A10340 7 2014-12-09 19:26:41.650 1 
301336662 120214A10341 7 2014-12-09 19:26:41.650 1 
301336662 120214A10342 7 2014-12-09 19:26:41.650 1 
301336662 120214A10343 7 2014-12-09 19:26:41.650 1 
301336662 120214A10344 7 2014-12-09 19:26:41.650 1 
301303464 101014A11003 4 2014-10-16 15:18:06.817 1 
301303464 101014A11004 4 2014-10-16 15:18:06.817 1 
301303464 101014A11005 4 2014-10-16 15:18:06.817 1 
301303464 101014A11006 4 2014-10-16 15:18:06.817 1 
301293879 100714A10258 15 2014-10-13 13:23:58.923 1 
301293879 100714A10259 15 2014-10-13 13:23:58.923 1 
301293879 100714A10260 15 2014-10-13 13:23:58.923 1 
301293879 100714A10261 15 2014-10-13 13:23:58.923 1 
301293879 100714A10262 15 2014-10-13 13:23:58.923 1 
301293879 100714A10263 15 2014-10-13 13:23:58.923 1 
301293879 100714A10264 15 2014-10-13 13:23:58.923 1 
301293879 100714A10265 15 2014-10-13 13:23:58.923 1 
301293879 100714A10266 15 2014-10-13 13:23:58.923 1 

То, что я на самом деле пытается получить только одна строка для каждого prod_num, строка с наименьшим sn.

Нравится это.

Может кто-нибудь указать мне, где я иду не так?

Спасибо, Билл

ответ

3

Удалить x.sn из группы по ...

Ваше заявление:

SELECT x.prod_num, Min(x.sn) sn, y.qty, x.date_tested,x.scrap 
FROM serial_numbers x 
JOIN prod_ord y on y.prod_num = x.prod_num 
where x.date_tested is not NULL and x.scrap = 1 
group by x.prod_num, x.sn, y.qty, x.date_tested,x.scrap 
order by x.date_tested desc, x.prod_num 

Должно быть:

SELECT x.prod_num, Min(x.sn) sn, y.qty, x.date_tested,x.scrap 
FROM serial_numbers x 
JOIN prod_ord y on y.prod_num = x.prod_num 
where x.date_tested is not NULL and x.scrap = 1 
group by x.prod_num, y.qty, x.date_tested,x.scrap 
order by x.date_tested desc, x.prod_num 

Вы» re говоря двигателю для того чтобы group by x.sn которое оно делает, но вы только хотите минимальный. Удалив x.sn из группы, вы должны получить желаемый результат.

+0

Большое спасибо! Я был так близко ... – wallenpb

+0

@wallenpb Да, ** ОЧЕНЬ ** близко. Вообще говоря, вы не хотите группировать агрегированные значения; 'min (x.sn)' в этом случае. – xQbert

+0

Как получается, что запрос, такой как следующий, не создает такое же количество строк, как то, что, по моему мнению, будет эквивалентным с помощью группы? ВЫБОР prod_num, Sn, date_tested, утиль ОТ serial_numbers , где date_tested не NULL, и лом = 1 и Sn = (выберите MIN (SN) от serial_numbers а, где a.prod_num = serial_numbers.prod_num) заказ по date_tested по алфавиту, prod_num – wallenpb

Смежные вопросы