2012-03-01 34 views
1

有什麼辦法讓查詢返回說8個字段,但只有一個字段組和一個字段只執行一個聚合函數? 我得到一個錯誤,表明我需要由所有沒有聚合函數的字段進行分組。ALTERNATE TO SQL GROUPBY(例如爲了避免重複聚合字段)

我需要找到每月完成調查的數量,但需要包括其他信息,如會話開始時間,會話狀態,會話ID等

當我嘗試執行此:

SELECT Datepart("m", starttime), 
     COUNT(sessionid), 
     sessionstatus, 
     starttime, 
     endtime, 
     surveyid, 
     surveybook, 
     userdesk 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 

我得到的錯誤: 「試圖執行一個查詢,不包括指定表達式‘SessionStatus’作爲一個聚合函數的一部分」

我並不需要通過任何其他的聚集和分組剩下的領域並不能讓我獲得每月的總額。

+0

您使用的數據庫是?你想要的其他值是什麼?該月份第一行的值。最後一行。任意排? – 2012-03-01 22:40:12

回答

1

表達式的工作。如果你使用的是GROUP BY您一定要到所有選定字段包含在GROUP BY不管什麼內。

如果在group by子句中包含所有內容,則可能無法獲得期望的結果,因爲我假設每個行在分組到多個列時都非常獨特。

假設你正在使用SQL Server可以嘗試:

SELECT Datepart("m", starttime), 
    COUNT(sessionid) OVER(PARTITION BY Datepart("m", starttime)) AS Count, 
    sessionstatus, 
    starttime, 
    endtime, 
    surveyid, 
    surveybook, 
    userdesk 
FROM survey_sessions 

這將顯示你與多少本月發生的計數尋找的信息顯示在每一行。

我不是100%確定你要完成什麼,所以很難做到更具體。

編輯:添加替代解決方案的訪問。

如果您需要它在訪問中工作,您可以嘗試一下,你可以嘗試以下操作。將「'替換爲與數據對應的數字,日期或字符串 - 第一個查詢返回。這會在每個月的總數中將行放在查詢的底部。

SELECT Datepart("m", starttime), 
    0 AS COUNT 
    sessionstatus, 
    starttime, 
    endtime, 
    surveyid, 
    surveybook, 
    userdesk 
FROM survey_sessions 

UNION ALL 

SELECT Datepart("m", starttime), 
    COUNT(sessionid) as Count, 
    '', 
    '', 
    '', 
    '', 
    '', 
    '' 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 
+0

This works對於續集服務器,但不幸的是我需要一個訪問解決方案,我搜索了周圍,並找不到任何相同的結果。在訪問中,我得到的錯誤:查詢表達式中的語法錯誤(缺少運算符)'COUNT(sessionid )OVER(PARTITION BY Datepart(「m」,starttime))' – 2012-03-02 00:09:08

+0

嘗試在底部進行上述編輯,我不確定它是否完全符合您的要求,但它會在底部仍然返回一個數據行也是如此。 – jmshapland 2012-03-02 01:10:24

+0

這很好。你在'0 AS COUNT'和'COUNT(sessionid)'之後留下了一個逗號作爲Count',否則就是我所需要的。謝謝!! – 2012-03-02 17:54:13

0

您正在其上進行分組一列,但你在SELECT子句具有多列...

+0

PS:我沒有認證,因爲我的代表發佈的問題發表評論。 – Teja 2012-03-01 22:41:45

0

有在包括GROUP BY子句中所有非聚合列沒有壞處。通常它只是從選擇列中簡單複製和粘貼。語法方面,它有點重複,但它產生相同的結果。新的查詢:

SELECT 
    Datepart("m", starttime) 
    ,COUNT(sessionid) 
    ,sessionstatus 
    ,starttime 
    ,endtime 
    ,surveyid 
    ,surveybook 
    ,userdesk 
FROM survey_sessions 
GROUP BY 
    Datepart("m", starttime) 
    ,sessionstatus 
    ,starttime 
    ,endtime 
    ,surveyid 
    ,surveybook 
    ,userdesk 
+0

我猜想你錯過了「剩餘字段分組並不能讓我獲得每月總數」的問題。 – 2012-03-01 22:47:12

1

Since searches for the error message點MS-Access中的最簡單方法是先用

SELECT Datepart("m", starttime), 
     COUNT(sessionid), 
     FIRST(sessionstatus), 
     FIRST(starttime), 
     FIRST(endtime), 
     FIRST(surveyid), 
     FIRST(surveybook), 
     FIRST(userdesk) 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 

如果你希望模擬COUNT OVER你可以這麼內嵌視圖(使用兩個,因爲我不牛逼想訪問SQL

SELECT 
     main.Month, 
     q.Kount, 
     main.sessionstatus, 
     main.starttime, 
     main.endtime, 
     main.surveyid, 
     main.surveybook, 
     main.userdesk, 
     main.sessionstatus 
    FROM 
    (SELECT Datepart("m", s.starttime) month, 

     s.sessionstatus, 
     s.starttime, 
     s.endtime, 
     s.surveyid, 
     s.surveybook, 
     s.userdesk 
     FROM survey_sessions) main 
    INNER JOIN (SELECT Datepart("m", starttime) [MONTH], 
         COUNT(sessionid) kount 
        FROM survey_sessions 
        GROUP BY Datepart("m", starttime)) q 
     ON main.month = q.month 
+1

這是非常有用的,並回答我發佈的具體問題,但事實證明,分區解決方案是我所需要的一般,因爲它顯示所有行。但是,由於我沒有足夠的聲望點,因此我無法就您的答案投票。 :-( – 2012-03-01 23:35:07

+0

@CuriousKodj我給你一個額外的查詢,模擬'COUNT OVER'我覺得像DCOUNT也可以工作,但它已經有一段時間 – 2012-03-02 02:24:18

+0

這很好,我只需要添加一個group by子句到內部連接和其他一些小細節,我不確定哪個解決方案更便宜(與上面的union all解決方案相比),但我會解決這個問題,我真的很感謝快速回復!!你們真棒!!! – 2012-03-02 17:57:40