2011-09-04 73 views
1

我想要做类似以下的事情。获取有关GROUP BY列的列

SELECT aspnet_Users.UserName, aspnet_Membership.Email, count(*) as Activities 
FROM aspnet_Users 
    INNER JOIN Activities ON aspnet_Users.UserId = Activities.ActUserID 
    INNER JOIN aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId 
    WHERE Activities.ActDateTime >= GETDATE() 
    GROUP BY aspnet_Users.UserName 
    ORDER BY Activities DESC 

但是这给了我一个错误。

列'aspnet_Membership.Email'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我理解错误一些。我试图选择不属于分组的一列。

然而,总是会有aspnet_Membership.Email和aspnet_Users.UserId之间一比一的关系。那么我将如何实现这一点?

+0

电子邮件和UserId之间的关系有什么相关性?为什么你想选择电子邮件,但不想按它分组? –

回答

3

变化:

GROUP BY aspnet_Users.UserId 

要:

GROUP BY aspnet_Users.UserName, aspnet_Membership.Email 

不知道为什么你认为你需要提到在分组的用户ID列,如果你不不想退货,或者你为什么认为你不应该按想要退货的列进行分组。

+0

对不起,我正在做的一些不同的修改让我的问题陷入了我的问题(现在已经纠正)。是的,你的建议有效。但是,我并不清楚如何。如果在两个“GROUP BY”列之间存在一对一的关系,那么'SELECT'ed列将始终反映该单一关系?而且,如果两栏之间没有一对一的关系,那么该陈述会做什么?感谢您提供任何其他提示。 –

+0

我不是在追问你的问题。你能否展示一些代表一对一关系的样本数据,以及一些样本数据“如果没有一对一关系”? –

0

要选择一个列,它必须位于group by子句中或聚合,您可以考虑按(aspnet_Users.UserName,aspnet_Membership.Email,aspnet_Users.UserId)进行分组。

我的猜测是,它会工作