SQL группы по проблеме при сортировке - PullRequest
2 голосов
/ 14 февраля 2011

У меня проблема с ошибкой:

Столбец EXT_Design_Standard.Name недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Я хочу сгруппировать записи на основе: cl.EXT_Design_Standard_ID

Я динамически отсортировал записи на основе (переменная sort @directionOfSort)

Кто-нибудь знает, как решить приведенную ниже проблему?

DECLARE @fieldSort varchar(50) = 'Date Changed'
DECLARE @directionOfSort varchar(1) = 'D'

SELECT              min(cl.EXT_Design_Standard_ID)                                      AS [EXT_Design_Standard_ID],
                    ds.Name                                                         AS [Standards Name],
                    ds.Reference_Code                                               AS [Ref],
                    ( SELECT dbo.EXFN_StripHTML(ds.Description) )                   AS [Description],
                    (select replace(convert(varchar(20),cl.Change_On,106),' ','-')) + ' (' + CONVERT(VARCHAR(5) , cl.Change_On , 108)+ ')' AS [Date Changed],


FROM    EXT_Design_Standard_Change_Log cl      

INNER JOIN EXT_Design_Standard ds 
    on ds.EXT_Design_Standard_ID = cl.EXT_Design_Standard_ID      

INNER JOIN Contact_Summary cs
    on cs.Contact_ID = cl.Change_By

GROUP BY cl.EXT_Design_Standard_ID
ORDER BY 
    CASE WHEN @fieldSort ='Standards Name'
        THEN ROW_NUMBER() over (order by ds.Name) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END
        END,
    CASE WHEN @fieldSort ='Ref'
        THEN ROW_NUMBER() over (order by ds.Reference_Code) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END
        END,
    CASE WHEN @fieldSort ='Description'
        THEN ROW_NUMBER() over (order by ( SELECT dbo.EXFN_StripHTML(ds.Description) )) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END
        END,
    CASE WHEN @fieldSort ='Date Changed'
        THEN ROW_NUMBER() over (order by cl.Change_On) * 
            case when @directionOfSort = 'A' 
                THEN 1 ELSE -1 END
        END

1 Ответ

3 голосов
/ 14 февраля 2011

Предложение select должно соответствовать группе по полям.Вы можете использовать только те поля, которые есть в предложении group by, все остальные неоднозначны, и вам нужна агрегатная функция.

В вашем случае у вас есть агрегатная функция для группы по полю, но не для других.

Таким образом, это предложение select

SELECT              min(cl.EXT_Design_Standard_ID),
                    ds.Name,
                    ds.Reference_Code

не подходит для этой группы по предложению

GROUP BY cl.EXT_Design_Standard_ID

Предполагается, что предложение group by является тем, что вы действительно хотитевам нужно адаптировать предложение select к чему-то вроде этого:

SELECT              cl.EXT_Design_Standard_ID,
                    min(ds.Name),
                    min(ds.Reference_Code)
...