【问题标题】:SQL Server Query LEFT JOIN, SUM and GROUP BY and I'm stumped!SQL Server 查询 LEFT JOIN、SUM 和 GROUP BY,我被难住了!
【发布时间】:2011-08-17 21:49:13
【问题描述】:

我正在用我的大脑来对抗这个

我有 3 个 SQL Server 2005 表

用户奖励

id, awardamount, userid, dateawarded, awardtypeid 

用户:

id, firstname, lastname

奖励类型:

id, title

所以如果awards 表有行

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

等等等等

一个用户可以有多个奖励,结果需要显示唯一用户,但有总奖励金额。此外,还需要 2 个连接,一个用于获取用户表中的用户名/姓和奖励类型标题。

所以我的查询看起来像这样(我知道它不起作用)

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

这可能吗?

【问题讨论】:

  • 如果一个用户有多个不同类型的奖励,预期的输出应该是什么?
  • 这将有助于向我们展示一些示例输入和预期输出。另外,什么版本的 SQL Server?
  • 你有一个 , 而不是 .在一个,userid
  • 修改问题以回答您的问题;)
  • 您在描述中说您想要唯一的用户(或每个用户一行)。但是,您已经包含了奖励类型,后来又说您还想要“该”奖励类型标题。这意味着每个用户、每个奖励类型(他们获得的奖励)只有一行。

标签: sql-server join group-by sum


【解决方案1】:

如果我理解正确的话,每位用户不应超过一行,并且您需要每位用户的总奖励金额。 另一方面,您想知道每个用户获得了什么样的奖励。 您可以为每个用户显示以逗号分隔的奖励列表:

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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      你可能想要

      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
      

      这会删除 id 列(可能不是您想要分组的内容)

      在第一种情况下,我在 select 中包含了 Awardtypeid,但这意味着您还必须将其添加到 group by。

      【讨论】:

      • 我会投票,但我还没有代表……但是是的,这解决了我的问题。谢谢!
      • +1 表示能够从给出的内容中收集到底想要什么(以及答案)。
      • 谢谢康拉德,我已经接受了你的回答 :) 谢谢你的提醒。我看过去的复选标记。是的,感谢您为我解释情况的错误尝试提供了答案:D
      【解决方案4】:

      您可以这样做,但您现在这样做的方式是显示奖励金额的数量,或者实际上是奖励金额的总和 - 但每个 id、用户、awardtypeid 组合。您需要自己获取用户和奖励总和,然后加入奖励类型 ID - 请注意,每个奖励类型 ID 都会重复奖励金额的总和

      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 
      

      通过在加入之前将每个用户的奖励金额相加,您应该能够得到您想要的,无需任何分组。

      【讨论】:

        猜你喜欢
        • 2021-01-30
        • 2016-04-11
        • 2021-11-06
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        相关资源
        最近更新 更多