web-dev-qa-db-ja.com

SQLServerクエリLEFTJOIN、SUM、およびGROUP BYを実行すると、困惑します。

私はこれに対して私の脳を打ち負かしています

SQL Server2005のテーブルが3つあります

serawards

id, awardamount, userid, dateawarded, awardtypeid 

ユーザー:

id, firstname, lastname

awardtypes:

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

これも可能ですか?

9
Sherdog

あなたはおそらく欲しい

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を含めましたが、これは、それをgroupbyに追加する必要があることを意味します。

18
Conrad Frix

私がこれを正しく理解していれば、ユーザーごとに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
0
Alex Aza

あなたはそれを行うことができますが、今それを行う方法は、賞金額の数、または実際には賞金額の合計を表示することです-しかし、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 

参加する前にユーザーごとの賞金額の合計を合計することで、グループ化せずに必要なものを取得できるはずです。

0
cairnz
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
0
Rob Boek