2010-01-04 2 views
1

Если мы начнем со следующего простого оператора SQL, который работает.Совокупные функции и группы по задачам

SELECT sor.FPARTNO, sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO 

FPartNo - номер детали, а Funetprice - это чистая цена. Пользователь также хочет описание, и это вызывает проблему. Если я прослеживание с этим:

SELECT sor.FPARTNO, sor.fdesc, sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO, sor.fdesc 

Если существует несколько вариаций описания для этой части числа, как правило, очень небольшие изменения в тексте, то я на самом деле не агрегат по номеру. Имеют смысл?

Я уверен, что это должно быть просто. Как я могу вернуть первый fdesc, который соответствует номеру детали? Любой из вариантов описания будет достаточным, поскольку они почти полностью идентичны.

Редактировать: Описание представляет собой текстовое поле.

ответ

4

Если вы не можете обновить до SQL Server 2005 для (макс) типа :-)

Попробуйте это. SUBSTRING работает над blobs, но возвращает varchar для текста. Таким образом, совокупность должна работать, и вы потеряете некоторые данные

SELECT 
    sor.FPARTNO, MIN(SUBSTRING(sor.fdesc, 1, 8000)), sum(sor.FUNETPRICE) 
FROM 
    sorels sor 
GROUP BY 
    sor.FPARTNO, SUBSTRING(sor.fdesc, 1, 8000) 
+1

Вам еще не нужно использовать MIN или MAX, иначе вы получите побочные группы? – recursive

+0

oops! исправлено это сейчас – gbn

0

Вы пробовали

SELECT sor.FPARTNO, MIN(sor.fdesc), sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO 

или даже MAX может сделать.

Постарайтесь литьем поля NTEXT

DECLARE @sorels TABLE(
     FPARTNO INT, 
     fdesc NTEXT, 
     FUNETPRICE FLOAT 
) 

SELECT sor.FPARTNO, MIN(CAST(sor.fdesc AS VARCHAR(4000))), sum(sor.FUNETPRICE) 
FROM @sorels sor 
GROUP BY sor.FPARTNO 
+0

Я попробовал Макс, и только теперь пытавшиеся Мин, и получили следующее сообщение об ошибке: Ошибки \t SQL Database Server Ошибка: текст, NTEXT и типы данных изображений являются недопустимыми в этом подзапросе или агрегированном выражении. – DavidStein

+0

Какой тип ** sor.fdesc **? –

+0

sor.fdesc - это текстовое поле, как я сказал выше в своем предыдущем редактировании. :) – DavidStein

0

не имел возможности проверить, но это должно быть близко. Если вы использовали SQL Server 2005, было бы намного более чистым с CTE.

SELECT agg.FPARTNO, 
     (SELECT TOP 1 inner.FDESC FROM sorels inner WHERE inner.FPARTNO = agg.FPARTNO) FDESC, 
     agg.FUNETPRICESUM 
FROM (SELECT sor.FPARTNO, 
       sum(sor.FUNETPRICE) FUNETPRICESUM 
     FROM sorels sor 
     GROUP BY sor.FPARTNO) agg 
+0

Inner - это зарезервированное слово, я считаю. – DavidStein

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