2012-03-01 78 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