Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未分组所有选择项的余额到期SQL_Sql_Postgresql_Group By - Fatal编程技术网

未分组所有选择项的余额到期SQL

未分组所有选择项的余额到期SQL,sql,postgresql,group-by,Sql,Postgresql,Group By,我已经提供了我的表的摘要,并且在SQL上有了一个良好的开端,但是我一直在想如何限制返回的项的数量。我应该能够选择一个或多个条款,并从这些条款中取回到期的余额 一个学生应该有一个记录,他们可以在几个条款上有几个预订,但付款不是针对预订,而是针对学生。这就是让我感到厌烦的部分 表结构、日期和我的SQL的开始日期如下。有人能帮我吗?该结果不应显示Sue Smith从第3条款中支付的500美元 我正在使用PostgreSQL,但我认为这是一个非常基本的问题,不需要任何特定于Postgres的东西 当前结

我已经提供了我的表的摘要,并且在SQL上有了一个良好的开端,但是我一直在想如何限制返回的项的数量。我应该能够选择一个或多个条款,并从这些条款中取回到期的余额

一个学生应该有一个记录,他们可以在几个条款上有几个预订,但付款不是针对预订,而是针对学生。这就是让我感到厌烦的部分

表结构、日期和我的SQL的开始日期如下。有人能帮我吗?该结果不应显示Sue Smith从第3条款中支付的500美元

我正在使用PostgreSQL,但我认为这是一个非常基本的问题,不需要任何特定于Postgres的东西

当前结果集: 模式: 查询:
以下是我的查询更新版本:

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
;
注意事项:

  • 我在主(外部)查询中包含了
    付款
    ,以避免子查询

  • 联接类型为
    LEFT[OUTER]联接
    ,因此缺少任何
    付款
    行不会阻止其他数据出现在结果集中

  • 连接条件包括
    term\u id
    (我认为这基本上就是您丢失的地方)

  • 最后,我使用了短表别名来提高可读性


我希望这就是您想要的。

找到了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

谢谢Dezzo和davek

就是这样,谢谢。谢谢你给我问题的标题,我没想到。我试着问一个高质量的问题——它似乎吸引了高质量的答案,就像你的一样。@user973828——你的问题确实质量很好。一个小的补充:你可以通过使用.Hi,附加问题来避免粘贴太多的代码(比如
INSERT
s)。。如果我在From子句中添加以下内容:s.student\u id上的From student s内部加入保留r=r.student\u id上的离开加入付款p.student\u id=r.student\u id和p.term\u id=r.term\u id,其中r.reservation\u完成和r.reservation\u删除的日期为空,而不是r.reservation\u等待列表和r.term\u id($list)我收到的预订费是假的。我不明白为什么?因为学生为一个预订支付了2笔费用,所以费用增加了一倍。我需要有付款的子查询来处理这种情况吗?
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
;
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
;
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