Sql server SQL Server查询留下了JOIN、SUM和GROUP BY,我被难倒了!
我正绞尽脑汁反对这一点 我有3个SQLServer2005表 用户奖励: 用户: 获奖类型: 如果奖励表中有行Sql server SQL Server查询留下了JOIN、SUM和GROUP BY,我被难倒了!,sql-server,join,group-by,sum,Sql Server,Join,Group By,Sum,我正绞尽脑汁反对这一点 我有3个SQLServer2005表 用户奖励: 用户: 获奖类型: 如果奖励表中有行 1, 300.00, 3, 01-01-2011, 1 2, 125.00, 3, 01-05-2011, 1 3, 50.00, 2, 01-05-2011, 2 用户表行 1, john, smith 2, mark, smith 3, bob, smith 奖励类型 1, cash 2, prize 我希望输出与此类似 bob smith, 425.00, cash ma
1, 300.00, 3, 01-01-2011, 1
2, 125.00, 3, 01-05-2011, 1
3, 50.00, 2, 01-05-2011, 2
用户表行
1, john, smith
2, mark, smith
3, bob, smith
奖励类型
1, cash
2, prize
我希望输出与此类似
bob smith, 425.00, cash
mark smith, 50, prize
等等
一个用户可以有多个奖励,结果需要显示唯一的用户,但有总奖励金额。此外,还需要两个联接,一个联接,以获取用户表中的用户名/姓和奖励类型标题
所以我的查询看起来像这样,我知道它不起作用
SELECT id, userid, awardtypeid, SUM(awardamount)
FROM awards a
LEFT JOIN userinfo ui ON ui.userid = a,userid
LEFT JOIN awardtypes ON awardtypesid = a.awardtypeid
GROUP BY userid
这是可能的吗?您可以这样做,但现在的方式是,它将显示奖励金额的数量,或者实际上是奖励金额的总和-但按id、用户、奖励类型id组合。您需要自己获取用户和奖励金额,然后加入awardtypeid-请注意,奖励金额的总和会对每个awardtypeid重复
SELECT
??.id ,
a.userid ,
a.awardtypeid ,
ab.awardamount ,
<whateverelse>
FROM
(select userid, SUM(awardamount) as awardamount FROM awards GROUP BY userid) AS ab
INNER JOIN awards AS a on ab.userid = a.userid
LEFT JOIN userinfo AS ui
ON ui.userid = a.userid
LEFT JOIN awardtypes AS at
ON awardtypesid = a.awardtypeid
在加入之前,通过将每个用户的奖励金额相加,您应该能够得到您想要的,而无需任何分组。您可能想要的
SELECT userid,
awardtypeid,
SUM(awardamount)
FROM awards a
LEFT JOIN userinfo ui
ON ui.userid = a.userid
LEFT JOIN awardtypes
ON awardtypesid = a.awardtypeid
GROUP BY userid,
awardtypeid
或
这会删除id列,可能不是您想要分组的内容
在第一种情况下,我在select中包含了awardtypeid,但这意味着您还必须将其添加到group by中。如果我理解正确,每个用户最多只能有一行,您需要每个用户的总奖励金额。
SELECT
ui.FirstName
,ui.LastName
,at.Title AS Award
,SUM(a.AwardAmount) AS AwardAmount
FROM Awards a
INNER JOIN UserInfo ui ON ui.UserId = a.UserId
INNER JOIN AwardTypes at ON at.AwardTypeId = a.AwardTypeId
GROUP BY ui.FirstName, ui.LastName, at.Title
ORDER BY ui.LastName, ui.FirstName
另一方面,你们想知道每个用户都获得了什么样的奖励。
您可以为每个用户显示以逗号分隔的奖励列表:
select
usr.FirstName,
usr.LastName,
awd.AwardAmount,
AwardTypes = (
select Title + ','
from UserAwards uaw
join AwardTypes awt on
uaw.AwardTypeId = awt.Id
where uaw.UserId = usr.id
for xml path(''))
from [User] usr
join (
select UserId, sum(AwardAmount) AwardAmount
from UserAwards uaw
group by UserId
) awd on
awd.UserId = usr.Id
如果一个用户有多个不同类型的奖励,那么预期的输出应该是什么?这将有助于向我们展示一些示例输入和预期输出。还有,什么版本的SQL Server?您有,而不是。在a中,UserId修改问题以回答您的问题;您在描述中说过,您需要唯一的用户或每个用户一行。但是,您已经包含了奖励类型,并且后来说您还想要奖励类型的标题。这意味着每个用户、每个奖项类型都会有一行。我会投票,但我还没有代表。。但这确实解决了我的问题。谢谢大家!+感谢康拉德,我接受了你的回答:谢谢你的提醒。。我的目光越过了对勾。是的,谢谢你给我提供了答案,我在解释情况时做了很糟糕的尝试
SELECT userid,
awardtypeid,
SUM(awardamount)
FROM awards a
LEFT JOIN userinfo ui
ON ui.userid = a.userid
LEFT JOIN awardtypes
ON awardtypesid = a.awardtypeid
GROUP BY userid,
awardtypeid
SELECT userid,
SUM(awardamount)
FROM awards a
LEFT JOIN userinfo ui
ON ui.userid = a.userid
LEFT JOIN awardtypes
ON awardtypesid = a.awardtypeid
GROUP BY userid
SELECT
ui.FirstName
,ui.LastName
,at.Title AS Award
,SUM(a.AwardAmount) AS AwardAmount
FROM Awards a
INNER JOIN UserInfo ui ON ui.UserId = a.UserId
INNER JOIN AwardTypes at ON at.AwardTypeId = a.AwardTypeId
GROUP BY ui.FirstName, ui.LastName, at.Title
ORDER BY ui.LastName, ui.FirstName
select
usr.FirstName,
usr.LastName,
awd.AwardAmount,
AwardTypes = (
select Title + ','
from UserAwards uaw
join AwardTypes awt on
uaw.AwardTypeId = awt.Id
where uaw.UserId = usr.id
for xml path(''))
from [User] usr
join (
select UserId, sum(AwardAmount) AwardAmount
from UserAwards uaw
group by UserId
) awd on
awd.UserId = usr.Id