2014-02-24 75 views
0

我想創建一個基本的排名並將存儲過程的結果從最顯示的主講人排序到最低。SQL Server:通過此計算計數總數和順序

我試過以下工作正常,如果我刪除groupCount和GROUP BY,但我不能讓它包括這個,以便由演示者分組。 基本上我想看到的是呈現最多(即groupCount的最大值)的人,然後是最低的人(即groupCount的最小值)。

我得到的錯誤是:

Msg 8120, Level 16, State 1, Procedure CountPresenters, Line 17 
Column 'MeetingDetails.topic' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

我保存至今的過程:

ALTER PROCEDURE [dbo].[CountPresenters] 
    @title nvarchar(200) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT  B.presenter, 
       B.topic, 
       A.meetingDate, 
       A.title, 
       COUNT(*) AS groupCount 
    FROM  MeetingDetails B 
    INNER JOIN MeetingDates A 
    ON   B.meetingID = A.meetingID 
    WHERE  B.itemStatus = 'active' 
    AND   A.title LIKE '%'[email protected]+'%' 
    GROUP BY B.presenter 
    ORDER BY groupCount desc, B.presenter, A.meetingDate desc 
    FOR XML PATH('presenters'), ELEMENTS, TYPE, ROOT('ranks') 
END 

非常感謝任何幫助,蒂姆。

+0

MAX(B.topic),? – StanislavL

+1

與加入無關,如果您聚合一列,則所有列也必須彙總或分組。 –

回答

0

我得到這個使用臨時表解決。不管怎麼說,多謝拉 !

1

無論您使用group by by功能時必須包含的select語句中的哪個字段。這裏是修改後的查詢。希望它會起作用。

ALTER PROCEDURE [dbo].[CountPresenters] 
    @title nvarchar(200) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT  B.presenter, 
       B.topic, 
       A.meetingDate, 
       A.title, 
       COUNT(*) AS groupCount 
    FROM  MeetingDetails B 
    INNER JOIN MeetingDates A 
    ON   B.meetingID = A.meetingID 
    WHERE  B.itemStatus = 'active' 
    AND   A.title LIKE '%'[email protected]+'%' 
    GROUP BY B.presenter, 
       B.topic, 
       A.meetingDate, 
       A.title 
    ORDER BY groupCount desc, B.presenter, A.meetingDate desc 
    FOR XML PATH('presenters'), ELEMENTS, TYPE, ROOT('ranks') 
+0

感謝您的支持!在這裏,我沒有收到很好的錯誤,但它仍然沒有按照我的意願進行分組和排序。它應該由主持人分組並且從最高組的數量到最低(其餘不那麼重要)。 – user2571510

+0

添加:看起來問題在於它不會爲演示者添加計數,因爲即使演示者多次出現,它總是從1開始。 – user2571510

+1

你想要顯示以下所有字段嗎?B.prepreter, B.topic, A.meetingDate, A.title, –

1

在group by子句,你必須與主持人

更正查詢一起添加話題,meetingDate和標題:

ALTER PROCEDURE [dbo].[CountPresenters] 
    @title nvarchar(200) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT  B.presenter, 
       B.topic, 
       A.meetingDate, 
       A.title, 
       COUNT(*) AS groupCount 
    FROM  MeetingDetails B 
    INNER JOIN MeetingDates A 
    ON   B.meetingID = A.meetingID 
    WHERE  B.itemStatus = 'active' 
    AND   A.title LIKE '%'[email protected]+'%' 
    GROUP BY B.presenter, B.topic, 
       A.meetingDate, 
       A.title 
    ORDER BY groupCount desc, B.presenter, A.meetingDate desc 
    FOR XML PATH('presenters'), ELEMENTS, TYPE, ROOT('ranks') 
END 
+0

謝謝。這與上述相同。它可以工作,但它不會被groupCount分組,因此即使演示者多次出現,也會分別統計每條記錄。 – user2571510

+0

看起來它只是不會爲相同的演示者添加單個計數。 – user2571510