我有一组表格,我想建立一个视图,例如:
会员
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
如何返回包含任意一个电子邮件地址(可能只是第一个找到的)并且汇总值总计的单行?如果显示的例子,这可能吗?
提前感谢任何意见/答案!
答案 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