2014-06-06 2 views
0

Я признаю, что эта группа всегда вызывает у меня проблемы, и, возможно, это потому, что я не понимаю ее правильного использования, но, надеюсь, когда я увижу, как это делается с этим, я больше понимаю.TSQL Group по ошибке с оператором

Мое заявление:

SELECT DATENAME(month, A.[endTime]) as [month], 
        MONTH(A.[endTime]) as [monthValue], 
        (
        SELECT count(employee) as attendees FROM Focus_Attendees WHERE meetingID = A.[id] 
        ) as attendees, 
        (
        SELECT count(id) as totalMeetings FROM Focus_Meetings WHERE id = A.[id] 
        ) as totalMeetings 

      FROM Focus_Meetings as A 
      WHERE YEAR(endTime) = @year 
      GROUP BY DATENAME(month, A.[endTime]), MONTH(A.[endTime]) 
      FOR XML PATH ('dataSet'), TYPE, ELEMENTS, ROOT ('root'); 

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

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

Любые советы для достижения этой цели путем настройки заявления?

Update:

Я изменил его на этот запрос:

 SELECT DATENAME(month, A.[endTime]) as [month], 
       MONTH(A.[endTime]) as [monthValue], 
       count(B.[employee]) as totalAttendees 
     FROM Focus_Meetings as A 
     JOIN focus_attendees as B 
     ON A.[id] = B.[meetingID] 
     WHERE YEAR(endTime) = @year 

     GROUP BY DATENAME(month, A.[endTime]), MONTH(A.[endTime]) 
     FOR XML PATH ('dataSet'), TYPE, ELEMENTS, ROOT ('root'); 

Это возвращает мой XML:

`<root> 
    <dataSet> 
    <month>July</month> 
    <monthValue>7</monthValue> 
    <totalAttendees>1</totalAttendees> 
    </dataSet> 
    <dataSet> 
    <month>June</month> 
    <monthValue>6</monthValue> 
    <totalAttendees>13</totalAttendees> 
    </dataSet> 
</root>` 

Это правильно, но мне нужны общие встречи в этом месяце, который будет count(A.[id]), но это дало бы мне ошибку

+0

Соединяется с Focus_Attendees и totalMeetings вместо того, чтобы иметь их в предложении select – TMNT2014

+0

Ли избавиться от предложения «для xml» все равно даст вам ту же ошибку? – reedstonefood

+0

@ TMNT2014 Я обновил вопрос с результатами вашего ответа – SBB

ответ

1

Используйте соединения вместо этого.

SELECT DATENAME(month, A.[endTime]) as [month], 
     MONTH(A.[endTime]) as [monthValue],     
     count(employee) , 
     count(distinct A.[Id]) 

FROM Focus_Meetings as A 
     LEFT JOIN Focus_Attendees B ON B.meetingID = A.[id] 
WHERE YEAR(A.endTime) = @year 
GROUP BY DATENAME(month, A.[endTime]), MONTH(A.[endTime]) 
FOR XML PATH ('dataSet'), TYPE, ELEMENTS, ROOT ('root'); 

Отказ от ответственности. Я не запускаю запрос, поэтому могут потребоваться некоторые незначительные изменения.

+0

Это выводит то же значение для подсчетов, когда на самом деле они должны быть разными. – SBB

+0

Использовали ли вы левые соединения или просто JOIN? – TMNT2014

+0

Использовал ваш запрос точно – SBB

1

Rig ht теперь вы группируетесь по дате, но пытаетесь выбрать счет по id.

Первая идея состоит в том, чтобы обернуть подзадачи в СУММ, чтобы все участники встречи в течение месяца собрались вместе.

Ваше утверждение:

SELECT count(id) as totalMeetings FROM Focus_Meetings WHERE id = A.[id] 
        ) as totalMeetings 

не имеет никакого смысла. Если id является первичным ключом, вы присоединяетесь к себе и всегда будете получать 1. Просто замените эту строку на count (*), чтобы получить общие собрания за месяц.

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