2014-12-01 1 views
0

Я не использовал Group By, что намного раньше, и всегда получаю сообщение об ошибке при попытке группы следующих по ошибке UserIDSQL Server: Как использовать групповую By в некоторых Выберите

:

Column 'Log.Version' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

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

Мой запрос (работает на выше + упрощенным для демонстрации за исключением):

ALTER PROCEDURE [dbo].Reporting_FetchUsage 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT  
     A.UserID, A.Tool, A.[Version], A.Note, A.[TimeStamp], 
     B.ADesc, B.SDesc, B.DDesc, B.ALN 
    FROM 
     Log A 
    LEFT JOIN 
     EmployeeTable B ON B.NTID = A.UserID 
    WHERE  
     A.[TimeStamp] > DATEADD(YEAR, -1, GETDATE()) 
     AND (A.Tool LIKE 'abc%' 
      OR 
      A.Tool LIKE 'def%' 
      OR 
      A.Tool LIKE 'ghi%') 
     AND (B.DDesc = 'CB' 
      OR 
      B.DDesc = 'PS') 
    GROUP BY  
     A.Tool, A.UserID 
    ORDER BY  
     A.Tool, A.UserID 
    FOR XML PATH('reporting'), ELEMENTS, TYPE, ROOT('ranks') 
END 

Большое спасибо заранее, Тим.

+2

Включите все поля в предложение 'GROUP BY', которое находится в вашем операторе' SELECT', который не используется в агрегате. – sgeddes

+0

Сообщение об ошибке довольно ясно. Если вы хотите, чтобы агрегированные данные вам нужно группировать по неагрегированным столбцам. Я думаю, вы не хотите, чтобы большая часть столбцов выводилась. Какую заметку, timeStamp и т. Д. Вы хотите получить, если хотите эти столбцы? –

ответ

4

What I am trying to get is a count for each user with every user only appearing once for each tool instead of listing every usage separately.

Если это так, то я ожидал бы увидеть count() где-то. Возможно, это ближе к тому, что вы хотите:

SELECT l.UserID, l.Tool, e.ADesc, e.SDesc, e.DDesc, e.ALN, 
     COUNT(*) as NumTools 
FROM Log l LEFT JOIN 
    EmployeeTable e 
    ON e.NTID = l.UserID 
WHERE l.[TimeStamp] > DATEADD(YEAR, -1, GETDATE()) AND 
     (l.Tool LIKE 'abc%' OR l.Tool LIKE 'def%' or l.Tool LIKE 'ghi%') AND 
     B.DDesc IN ('CB', 'PS') 
GROUP BY l.UserID, l.Tool, e.ADesc, e.SDesc, e.DDesc, e.ALN, 
ORDER BY l.Tool, l.UserID; 

Это предполагает, что таблица работник не имеет дубликатов, относительно условий соединения на Log.

+0

Большое спасибо - это прекрасно. У меня был граф, но я забыл упомянуть в нем на этом посту, извините за это. e содержит только уникальные значения, поэтому это работает отлично. Спасибо за быстрый ответ ! – user2571510

2

Включите все поля в свой GROUP BY, которые указаны в операторе SELECT, которые не используются в агрегате.

ALTER PROCEDURE [dbo].Reporting_FetchUsage 

AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT  A.UserID, 
       A.Tool, 
       A.[Version], 
       A.Note, 
       A.[TimeStamp], 
       B.ADesc, 
       B.SDesc, 
       B.DDesc, 
       B.ALN 
    FROM  Log A 
    LEFT JOIN EmployeeTable B 
    ON   B.NTID = A.UserID 
    WHERE  A.[TimeStamp] > DATEADD(YEAR, -1, GETDATE()) 
    AND   (
        A.Tool LIKE 'abc%' 
        OR 
        A.Tool LIKE 'def%' 
        OR 
        A.Tool LIKE 'ghi%' 
       ) 
    AND   (
        B.DDesc = 'CB' 
        OR 
        B.DDesc = 'PS' 
       ) 
GROUP BY A.Tool, 
      A.UserID, 
      A.[Version], 
      A.Note, 
      A.[TimeStamp], 
      B.ADesc, 
      B.SDesc, 
      B.DDesc, 
      B.ALN 
    ORDER BY A.Tool, A.UserID 
    FOR XML PATH('reporting'), ELEMENTS, TYPE, ROOT('ranks') 

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