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

时间:2011-06-07 12:49:59

标签: sql sql-server-2008 join aggregate-functions

我有一组表格,我想建立一个视图,例如:

会员

ID ¦ Name
---¦------
1  ¦ John

交易

ID¦ MemberID
--¦-----------
1 ¦    1

TransactionPart

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

我在下面提出了这个声明,但如果电子邮件地址不同,它会返回2行。

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

如何返回包含任意一个电子邮件地址(可能只是第一个找到的)并且汇总值总计的单行?如果显示的例子,这可能吗?

提前感谢任何意见/答案!

3 个答案:

答案 0 :(得分:1)

你几乎就在那里,所需要的只是<{1}}上的 NOT 组。

使用任何聚合函数返回一个EmailAddress 。 (我使用了EmailAddres

SQL声明

MIN

答案 1 :(得分:1)

仅按m.Name&amp;组分组在MAX上应用MIN(或s.EmailAddress)会给你一个地址('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

答案 2 :(得分:1)

我面前没有SQL 2008,但是你可以在varchar字段上做一个MIN吗?

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
相关问题