0

私は、スタッフのメンバーが前向きな態度と行動のために生徒にポイントを割り当てる学校報酬システムを実行しています。

私は2つのテーブルを持っています:

スタッフ 、、、、、、、、、ID_ Firstname_ Surname_ Position_ Faculty_ Subject_HoursAllocation

トランザクション 、、、、、、、Transaction_ID_ Datetime_ Giver_ID_ Recipient_ID_ Points_Category_IDReason

スタッフのメンバーが週単位で割り当てたポイント数を示すSQLステートメントを作成しようとしています。

この文...

SELECT
  CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
  SUM(t.Points) AS `Points Allocated`
FROM transactions t
LEFT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY t.Giver_ID
ORDER BY `Points Allocated` ASC

...その週にポイントを割り当てたユーザーのリストとその数を表示します。

報酬システム-スタッフの名前と割り当てられたポイント

ただし、0ポイントを割り当てたユーザーは表示されません。

それらのユーザーを含めるようにステートメントを修正する方法はありますか?おそらく、staffテーブルを使用して結合を逆に記述し、 transactions?に結合しています。残念ながらどこから始めればいいのかわかりません。

前もって感謝します、

4

2 に答える 2

1

はい、あなたは逆転しなければなりません、

SELECT
  CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
  COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID
WHERE t.Datetime >= '2012-10-08' or t.Datetime IS NULL
GROUP BY s.ID
ORDER BY `Points Allocated` ASC

編集

Ianzzが提案したように、より高速である必要があります

SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID and t.Datetime >='2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC

または、RIGHT JOINを使用してs.IDでグループ化します(どちらの場合も、NULL値が必要ない場合は、SUM(t.Points)で合体を使用します。また、「NULLトランザクション日時」をチェックするか、次の日付述語を使用する必要があります。参加する

(FROM句で)私のプリンシパルエンティティからすべてを選択し、結合データが存在する別のエンティティに結合しようとすると、右結合よりも左結合が表示されます。しかし、両方とも同じように機能するはずです

于 2012-10-11T14:39:36.130 に答える
0

トランザクションテーブルのIDではなく、スタッフテーブルのIDでグループ化する必要があります。また、代わりに右結合を使用する必要があります。トランザクションテーブルに「null」があるスタッフを保持したいので。

SELECT
  CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
  SUM(t.Points) AS `Points Allocated`
FROM transactions t
RIGHT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC
于 2012-10-11T14:38:20.607 に答える