Sql 如何在具有聚合列的联接表上返回第一个值

Sql 如何在具有聚合列的联接表上返回第一个值,sql,sql-server-2008,join,aggregate-functions,Sql,Sql Server 2008,Join,Aggregate Functions,我有一组表,我想从中构建视图,例如: Name ¦ TotalValue ¦ Email Address -----¦------------¦--------------- John ¦ 200 ¦ x@x.com 成员 ID ¦ Name ---¦------ 1 ¦ John 交易 ID¦ MemberID --¦----------- 1 ¦ 1 交易部分 ID ¦ TransactionID ¦ SchemeID ¦ Value ---¦----------

我有一组表,我想从中构建视图,例如:

Name ¦ TotalValue ¦ Email Address -----¦------------¦--------------- John ¦ 200 ¦ x@x.com 成员

ID ¦ Name ---¦------ 1 ¦ John 交易

ID¦ MemberID --¦----------- 1 ¦ 1 交易部分

ID ¦ TransactionID ¦ SchemeID ¦ Value ---¦---------------¦----------¦------- 1 ¦ 1 ¦ 1 ¦ 150 2 ¦ 1 ¦ 2 ¦ 50 计划

ID ¦ EmailAddress ---¦-------------- 1 ¦ x@x.com 2 ¦ y@y.com 视图中的一个典型行将包含成员的名称、交易的总价值以及与交易部分相关的其中一个方案的任何电子邮件地址

例如:

Name ¦ TotalValue ¦ Email Address -----¦------------¦--------------- John ¦ 200 ¦ x@x.com 我在下面列出了这个语句,但是如果电子邮件地址不同,它会返回两行

SELECT m.Name as Name, SUM(tp.Value) as TotalValue, s.EmailAddress as EmailAddress FROM Member m INNER JOIN Transaction t ON m.ID = t.MemberID INNER JOIN TransactionPart tp ON tp.TransactionID = t.ID INNER JOIN Scheme s ON s.ID = tp.SchemeID GROUP BY m.Name, s.EmailAddress 结果:

Name ¦ TotalValue ¦ Email Address -----¦------------¦--------------- John ¦ 150 ¦ x@x.com John ¦ 50 ¦ y@y.com 如何返回一行,该行包含两个电子邮件地址中的任何一个,可能只是第一个找到的具有聚合值total的电子邮件地址?鉴于所示示例,这是否可行


提前感谢您的评论/回答

你就快到了,所需要的只是不要在EmailAddres上分组

使用任何聚合函数返回电子邮件地址。我用过MIN

SQL语句

仅按m.Name分组并在s.EmailAddress上应用MAX或MIN,将为您提供一个地址“MAX”,并按字母顺序排列字符串:

SELECT 
   m.Name as Name,
   SUM(tp.Value) as TotalValue,
   MAX(s.EmailAddress) as EmailAddress
FROM 
   Member m INNER JOIN 
   Transaction t ON m.ID = t.MemberID INNER JOIN 
   TransactionPart tp ON tp.TransactionID = t.ID INNER JOIN 
   Scheme s ON s.ID = tp.SchemeID
GROUP BY 
   m.Name

我面前没有SQL 2008,但您能在varchar字段上运行一分钟吗

SELECT 
   m.Name as Name, SUM(tp.Value) as TotalValue, MIN(s.EmailAddress) as EmailAddress
FROM 
   Member m INNER JOIN 
   Transaction t ON m.ID = t.MemberID INNER JOIN 
   TransactionPart tp ON tp.TransactionID = t.ID INNER JOIN 
   Scheme s ON s.ID = tp.SchemeID
GROUP BY 
   m.Name
另一种方法是对SchemeID执行一些逻辑,然后使用相关子查询来获取电子邮件地址

SELECT 
   m.Name as Name,
   SUM(tp.Value) as TotalValue,
   (SELECT EmailAddress FROM Scheme WHERE ID = MIN(tp.SchemeID)) as EmailAddress
FROM 
   Member m INNER JOIN 
   Transaction t ON m.ID = t.MemberID INNER JOIN 
   TransactionPart tp ON tp.TransactionID = t.ID
GROUP BY 
   m.Name