Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server查询留下了JOIN、SUM和GROUP BY,我被难倒了!_Sql Server_Join_Group By_Sum - Fatal编程技术网

Sql server SQL Server查询留下了JOIN、SUM和GROUP BY,我被难倒了!

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

我正绞尽脑汁反对这一点

我有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
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