2011-06-07 27 views
2

我有一组我想建立从视图表,例如:我如何返回第一个值的连接表与汇总列

会员

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

交易

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

TransactionPart

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

方案

 
ID ¦ EmailAddress 
---¦-------------- 
1 ¦ [email protected] 
2 ¦ [email protected] 

典型的行中的视图将包含部件,交易的总价值和该交易的部分涉及方案中的一个的任何电子邮件地址的名称。

例如:

 
Name ¦ TotalValue ¦ Email Address 
-----¦------------¦--------------- 
John ¦ 200  ¦ [email protected] 

我想出了低于此statment但如果电子邮件地址不同,它返回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  ¦ [email protected] 
John ¦ 50  ¦ [email protected] 

如何返回一个单独的一行中包含的任何电子邮件地址(可能只是第一个发现)与聚合值总?这是可能的给出的例子显示?

在此先感谢您的任何意见/答案!

+1

随意给予好评的答案;) – MatBailie 2011-06-07 13:13:17

+0

我不能与这样一个低信誉:( – Brett 2011-06-07 13:15:34

回答

1

你几乎在那里,所需要的就是上的不是组。

使用任何聚合函数返回a EmailAddress。 (我用MIN

SQL语句

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 
+0

非常感谢 – Brett 2011-06-07 13:12:26

1

集团仅通过m.Name &上s.EmailAddress申请MAX(或MIN),会给你一个地址( '最大' 与字符串按字母排序):

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 
+0

非常感谢 – Brett 2011-06-07 13:11:59

1

我没有SQL 2008在我面前,但你可以做一个MIN上一个varchar f ield?

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 
+0

非常感谢!!! – Brett 2011-06-07 13:12:06

相关问题