私はこれに対して私の脳を打ち負かしています
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
これも可能ですか?
あなたはおそらく欲しい
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に追加する必要があることを意味します。
私がこれを正しく理解していれば、ユーザーごとに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
あなたはそれを行うことができますが、今それを行う方法は、賞金額の数、または実際には賞金額の合計を表示することです-しかし、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
参加する前にユーザーごとの賞金額の合計を合計することで、グループ化せずに必要なものを取得できるはずです。
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