2015-12-04 2 views
-1

Этот запрос возвращает ошибку, как будто она не содержится ни в агрегатной функции, ни в предложении GROUP BY.группа без функции агрегата и получить одно значение от него

SELECT SPEC_VALUE,SPEC_SKU 
FROM spec 
    join specdb on specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 

Это возвращает

1 0035862 
2 0051197 
2 0063493 
2 0013372 
2 0089991 
3 0087134 
4 0002602 
5 0002041 
5 0002042 
5 0002050 
5 0002044 
5 0024315 
6 0085601 
6 0090337 
7 0002789 
7 0002790 
7 0002791 

Теперь я хочу запрос должен вернуть первую группу по значению, как

1 0035862 
2 0051197 
3 0087134 
4 0002602 
5 0002041 
6 0085601 
7 0002789 

Я попытался

SELECT SPEC_VALUE,SPEC_SKU 
FROM spec 
    JOIN specdb on specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 
GROUP BY spec.SPEC_VALUE 

Но это показывает ошибку:

"it is not contained in either an aggregate function or the GROUP BY clause."

Я использовал отличный, но он также показывает ошибки.

+1

Distinct почти никогда не правильное решение. Одним из решений является использование агрегатной функции, например 'min (SPEC_SKU), как SPEC_SKU'. – Arvo

+0

У вас нет предложения ORDER BY, так что только с этими двумя столбцами первое значение не имеет смысла. – Mihai

+0

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

ответ

-1

Похоже, что вы хотите использовать функцию мин на SKU для каждого SPEC возвращенного:

SELECT SPEC_VALUE 
,MIN(SPEC_SKU) 
FROM spec 
JOIN specdb 
ON specdb_tech_no = SPEC_TECH_NO 
WHERE SPEC_TECH_NO = '20081' 
GROUP BY spec.SPEC_VALUE 
+0

'2 0051197' это не мин. OP хочет «первую» строку за группу, но он не знает, что это невозможно с помощью cols, которые он предоставил. –

+0

Если он не знает, что это невозможно, разве не полезно показать ему, что возможно? Ему нужно заполнить все столбцы, которые не входят в группу, но ясно, что это новая концепция. Почему бы вам не дать ответ OP, прежде чем комментировать и опустить? – Vinnie

+0

Я уже знаю без OP, что ваш запрос вернет '2 0013372', но он хочет' 2 0051197', так что это неверный ответ. –

-1

Предполагая, что вы хотите, чтобы первый экземпляр каждого из них, вы можете использовать раздел, как показано ниже:

SELECT * FROM(
select ROW_NUMBER() OVER(PARTITION BY SPEC_VALUE ORDER BY SPEC_VALUE DESC) AS ROWNUMBER, 
SPEC_VALUE, 
SPEC_SKU 
FROM @temp) AS t1 
WHERE t1.ROWNUMBER = 1 

Вы можете поиграть с вышеуказанным, чтобы получить разные наборы результатов.

+0

'2 0051197' это не макс. OP хочет первую строку на группу, но он не знает, что это невозможно с помощью cols, которые он предоставил. –

+0

Хорошо дано Я не пытаюсь вернуть максимальные значения, я бы не ожидал. Набор результатов из приведенного выше дает то, что после op (т.е. первая строка для каждого SPEC_VALUE). – ricky89

+0

нет, это не так. Вы можете думать, что оно вернет первые значения, но на других машинных результатах могут быть разные. Вы заказываете постоянным. –

0

Эта ошибка говорит о том, что на каком основании я (SQL Server) выполняется Группировать по эксплуатации на Spec_Value? В вашем случае Spec_sku не содержится какой-либо агрегатной функции и не в Группе пункта.

Либо вы хотите выбрать одно конкретное значение (например, MIN, SUM или AVG), в этом случае вы должны использовать соответствующую статистическую функцию, или вы хотите, чтобы выбрать все значения в качестве новой строки (т.е. в том числе Spec_sku в списке полей GROUP BY). Но в нашем случае, т.е. не в наших требованиях и примечаниях, что вы не можете использовать TOP Функция для столбца Spec_sku с разделением по группе.

Так Согласно выходным Требованию Попробуйте этот код один раз:

;with cte as 
(
SELECT SPEC_VALUE,SPEC_SKU, ROW_NUMBER() OVER (PARTITION BY SPEC_VALUE ORDER BY SPEC_VALUE) AS rn 
FROM spec as s 
    JOIN specdb as sd on s.tech_no = Sd.TECH_NO 
WHERE S.TECH_NO = '20081') 

select SPEC_VALUE,SPEC_SKU from cte where rn=1 

ВЫВОД:

SPEC_VALUE SPEC_SKU 
1   0035862 
2   0051197 
3   0087134 
4   0002602 
5   0002041 
6   0085601 
7   0002789 
+1

Это тот же неправильный выбор, что и в ответе ricky89. Однажды утром вы можете обнаружить, что на удивление ваш выбор выбирает разные значения. Заказ не гарантируется. –

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