1

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

トランザクションTransaction_ID Datetime Giver_ID Recipient_ID Points Category_ID Reason

報酬Reward_ID Title Description Image_URL Date_Inactive Stock_Count Cost_to_User Cost_to_System

購入Purchase_ID Datetime Reward_ID Quantity Student_ID Student_Name Date_DealtWith Date_Collected


スタッフは、次のように、トランザクションテーブルへのエントリとなるポイントを学生に与えます。

Transaction_ID Datetime Giver_ID Recipient_ID Points Category_ID Reason
8 2011-09-07 36761 127963 2 1 Excellent behaviour in behaviour unit

その後、学生は次のように購入テーブルへのエントリとなる報酬を購入できます。

Purchase_ID Datetime Reward_ID Quantity Student_ID Student_Name Date_DealtWith Date_Collected
1570 2012-05-30 12:46:36 2 1 137616 Bradley Richardson NULL NULL

すべての報酬は、報酬データベーステーブルに手動で保存されます。

Reward_ID Title Description Image_URL Date_Inactive Stock_Count Cost_to_User Cost_to_System
1 Lunch Time Queue Pass (month) Beat the queue and get to the hot food early! /user/74/167976.png 2012-04-16 11:50:00 0 100 0


私の質問はこれです:

学生名、獲得ポイント、消費ポイント、残りポイントを返すために使用できるSQLステートメントは何ですか?

私はしばらく前に同様の質問をしましたが、それは次のステートメントを提供しました。ただし、検査の結果、完全に正確であるとは限りません。具体的には、使用済みポイントが正しく機能していません。

SELECT  Recipient_ID AS StudentID,
        SumOfPointsOfPurchasesMade.Points AS PurchasesMade,
        SumOfPointsEarned.Points AS PointsEarned,
        SumOfPointsEarned.Points - COALESCE(SumOfPointsOfPurchasesMade.Points, 0) AS CurrentPoints
FROM   
(
    SELECT SUM(Points) AS Points, Recipient_ID 
    FROM   transactions
    GROUP  BY Recipient_ID
) AS SumOfPointsEarned 
    LEFT JOIN 
    (
        SELECT purchases.Student_ID,  SUM(rewards.Cost_to_User) AS Points 
        FROM   purchases 
            INNER JOIN rewards 
            ON purchases.Reward_ID = rewards.Reward_ID
        GROUP  BY purchases.Student_ID
    ) AS SumOfPointsOfPurchasesMade 
    ON SumOfPointsEarned.Recipient_ID = SumOfPointsOfPurchasesMade.Student_ID
WHERE SumOfPointsEarned.Points < SumOfPointsOfPurchasesMade.Points
ORDER BY `CurrentPoints`  DESC

前もって感謝します、

4

2 に答える 2

3

外部結合を使用してテーブルを結合し、生徒ごとにグループ化するだけです。

SELECT purchases.Student_Name                               AS `Student Name`,
       SUM(transactions.Points)                             AS `Points Earned`,
       SUM(rewards.Cost_to_User)                            AS `Points Spent`,
       SUM(transactions.Points) - SUM(rewards.Cost_to_User) AS `Points Remaining`
FROM   transactions
  LEFT JOIN purchases ON purchases.Student_ID = transactions.Recipient_ID
  LEFT JOIN rewards   USING (Reward_ID)
GROUP BY purchases.Student_ID
ORDER BY `Points Remaining` DESC
于 2012-07-04T11:23:29.643 に答える
1

他の投稿からの小さな間違いが私が抱えていた問題を修正することに愚かなことに気づきました:

SELECT SumOfPointsEarned.Points - COALESCE(SumOfPointsOfPurchasesMade.Points, 0) AS CurrentPoints
FROM   
(
    SELECT SUM(Points) AS Points, Recipient_ID 
    FROM   transactions 
            WHERE Recipient_ID= 137642
    GROUP  BY Recipient_ID
) AS SumOfPointsEarned 
    LEFT JOIN 
    (
        SELECT purchases.Student_ID,  SUM(rewards.Cost_to_User * purchases.Quantity) AS Points 
        FROM   purchases 
            INNER JOIN rewards 
            ON purchases.Reward_ID = rewards.Reward_ID 
                    WHERE Student_ID = 137642
        GROUP  BY purchases.Student_ID
    ) AS SumOfPointsOfPurchasesMade 
    ON SumOfPointsEarned.Recipient_ID = SumOfPointsOfPurchasesMade.Student_ID
ORDER BY CurrentPoints ASC

この1行が問題でした:

SUM(rewards.Cost_to_User * purchases.Quantity) AS Points

数量の乗算はありません。ドー!

于 2012-07-04T11:57:02.767 に答える