2

私は自分のテーブルの要約を提供し、SQLをうまく使い始めましたが、返されるアイテムの数を制限する方法を理解することに固執しています。1つ以上の用語を選択し、それらの用語だけで残高を取り戻すことができるはずです。

学生は1つのレコードを持っている必要があり、複数の条件で複数の予約を行うことができますが、支払いは予約に固有のものではなく、学生に固有のものです。それが私を失望させている部分です。

テーブルの構造、日付、SQLの開始は次のとおりです。誰かが私を助けてくれますか?この結果は、SueSmithの第3期からの500ドルの支払いを示しているはずではありません。

私はPostgreSQLを使用していますが、これはPostgresに固有の質問を必要としない非常に基本的な質問だと思います。

現在の結果セット:

Student ID  Last        First   Total Fees  Reservation Count   Amount Paid Amount Due
123456      Jones       Amy     50          1                   50          0
412365      Smith       Sue     100         3                   545         -445
741258      Anderson    Jon     50          1                   0.00        50.00
963258      Holmes      Fred    100         2                   30          70

スキーマ:

SET search_path TO temp, public;
CREATE TABLE term
(term_id                SERIAL PRIMARY KEY,
term_title              VARCHAR(100));

CREATE TABLE student
(student_id                 SERIAL PRIMARY KEY,
student_sis_id              VARCHAR(15),   
student_first_name              VARCHAR(30),
student_last_name               VARCHAR(100)); 

CREATE TABLE reservation
(reservation_id                      SERIAL PRIMARY KEY,
student_id                          INTEGER REFERENCES student ON UPDATE CASCADE,
term_id                             INTEGER REFERENCES term ON UPDATE CASCADE,   
reservation_fee_amount              NUMERIC DEFAULT 0.00);

CREATE TABLE payment
(payment_id                  SERIAL PRIMARY KEY,
student_id                  INTEGER REFERENCES student ON UPDATE CASCADE,
term_id                     INTEGER REFERENCES term ON UPDATE CASCADE,
payment_cash_amount         NUMERIC,
payment_credit_card_amount  NUMERIC,
payment_check_amount        NUMERIC);

INSERT INTO term VALUES (DEFAULT, 'SESSION 1');
INSERT INTO term VALUES (DEFAULT, 'SESSION 2');
INSERT INTO term VALUES (DEFAULT, 'SESSION 3'); 

INSERT INTO student VALUES (DEFAULT, 412365, 'Sue', 'Smith');
INSERT INTO student VALUES (DEFAULT, 123456, 'Amy', 'Jones');
INSERT INTO student VALUES (DEFAULT, 741258, 'Jon', 'Anderson');
INSERT INTO student VALUES (DEFAULT, 963258, 'Fred', 'Holmes');

INSERT INTO reservation VALUES (DEFAULT, 1, 1, 50);
INSERT INTO reservation VALUES (DEFAULT, 1, 2, 50);
INSERT INTO reservation VALUES (DEFAULT, 2, 1, 50);
INSERT INTO reservation VALUES (DEFAULT, 3, 2, 50);
INSERT INTO reservation VALUES (DEFAULT, 4, 1, 50);
INSERT INTO reservation VALUES (DEFAULT, 4, 2, 50);
INSERT INTO reservation VALUES (DEFAULT, 1, 3, 50);

INSERT INTO payment VALUES (DEFAULT, 1, 1, 25, 0, 0);
INSERT INTO payment VALUES (DEFAULT, 1, 1, 0, 20, 0);
INSERT INTO payment VALUES (DEFAULT, 2, 1, 25, 25, 0);
INSERT INTO payment VALUES (DEFAULT, 4, 1, 10, 10, 10);
INSERT INTO payment VALUES (DEFAULT, 1, 3, 500, 0, 0);

クエリ:

SELECT      
    student.student_sis_id AS "Student ID",        
    student.student_last_name AS Last,
    student.student_first_name AS First,
    SUM(reservation.reservation_fee_amount) AS "Total Fees",
    (
        SELECT COUNT(reservation.reservation_id)
        FROM reservation
        WHERE student.student_id = reservation.student_id
    ) AS "Reservation Count",
    (
        SELECT 
            COALESCE(SUM(
                payment.payment_check_amount
                + payment.payment_cash_amount
                + payment.payment_credit_card_amount
            ), 0.00)  
        FROM payment 
        WHERE payment.student_id = student.student_id
    ) AS "Amount Paid",
    SUM(reservation.reservation_fee_amount) - (
        SELECT 
            COALESCE(SUM(
                payment.payment_check_amount
                + payment.payment_cash_amount
                + payment.payment_credit_card_amount
            ), 0.00)  
        FROM payment WHERE payment.student_id = student.student_id
    ) AS "Amount Due" 
FROM 
    student
    INNER JOIN reservation ON student.student_id = reservation.student_id  
WHERE reservation.term_id IN (1,2)
GROUP BY
    student.student_id, 
    student.student_sis_id,        
    student.student_last_name,
    student.student_first_name
ORDER BY 
    student.student_sis_id
;
4

2 に答える 2

1

クエリの更新バージョンは次のとおりです。

SELECT      
    s.student_sis_id AS "Student ID",        
    s.student_last_name AS Last,
    s.student_first_name AS First,
    SUM(r.reservation_fee_amount) AS "Total Fees",
    COUNT(r.reservation_id) AS "Reservation Count",
    COALESCE(
        SUM(
            p.payment_check_amount
            + p.payment_cash_amount
            + p.payment_credit_card_amount
        ), 0.00
    ) AS "Amount Paid",
    SUM(r.reservation_fee_amount) - (
        COALESCE(
            SUM(
                p.payment_check_amount
                + p.payment_cash_amount
                + p.payment_credit_card_amount
            ), 0.00
        )  
    ) AS "Amount Due" 
FROM 
    student s
    INNER JOIN reservation r ON s.student_id = r.student_id  
    LEFT JOIN payment p ON p.student_id = r.student_id AND p.term_id = r.term_id
WHERE r.term_id IN (1,2)
GROUP BY
    s.student_id, 
    s.student_sis_id,        
    s.student_last_name,
    s.student_first_name
ORDER BY 
    s.student_sis_id
;

注目すべき点:

  • paymentsサブクエリを回避するために、メイン(外部)クエリに含めました

  • 結合タイプはですLEFT [OUTER] JOIN。したがって、payment行がなくても、他のデータが結果セットに表示されるのを妨げることはありません。

  • 参加条件には以下が含まれますterm_id(基本的にこれはあなたが失われたポイントだったと思います)

  • そして最後に、読みやすさを向上させるために短いテーブルエイリアスを使用しました。

これがあなたが求めているものであることを願っています。

于 2012-09-01T18:50:00.357 に答える
1

2つの支払い入力の問題の解決策を見つけました(元の質問では認識していませんでした)。答えは次のとおりです。

set search_path to temp, public;
SELECT      
s.student_sis_id AS "Student ID",        
s.student_last_name AS "Last Name",
s.student_first_name AS "First Name",
SUM(r.reservation_fee_amount) AS "Total Fees",
COALESCE(p.paid, 0.00) AS "Amount Paid",
COALESCE(SUM(r.reservation_fee_amount) - p.paid, 0.00) AS "Amount Due"    
FROM 
    student s       
    INNER JOIN reservation r ON s.student_id = r.student_id
    left outer join 
    (
      select student_id, term_id,
        SUM(
            p.payment_check_amount
            + p.payment_cash_amount
            + p.payment_credit_card_amount
        ) AS "paid" 
      from payment p
      group by student_id, term_id
    ) as p 
    ON p.student_id = r.student_id AND p.term_id = r.term_id
        WHERE r.reservation_completed  AND  r.term_id IN (1,2)                      
GROUP BY
    s.student_sis_id,        
    s.student_last_name,
    s.student_first_name,
    p.paid
ORDER BY 
    s.student_sis_id

dezsoとdavekに感謝します

于 2012-09-04T13:27:27.870 に答える