I have two tables: SZRATND and SFRSTCR.
+--------------+-------------------+-------------+-------------------+-----------------------+---------------------+
| SZRATND_PIDM | SZRATND_TERM_CODE | SZRATND_CRN | SZRATND_RSTS_CODE | SZRATND_ATTENDING_IND | SZRATND_LAST_ATTEND |
+--------------+-------------------+-------------+-------------------+-----------------------+---------------------+
| 264185 | 201480 | 82223 | RE | Y | |
| 264185 | 201710 | 10716 | RW | N | 1/16/2017 |
| 264185 | 201710 | 10943 | RW | S | 4/29/2017 |
| 264185 | 201710 | 10960 | RW | S | 4/29/2017 |
| 264185 | 201710 | 11362 | RW | S | 4/10/2017 |
| 264185 | 201580 | 80094 | RE | Y | |
| 264185 | 201610 | 10439 | D2 | Y | |
| 264185 | 201680 | 80769 | RW | Y | |
| 264185 | 201680 | 82184 | RW | Y | |
| 264185 | 201680 | 82114 | RW | Y | |
| 264185 | 201680 | 80806 | RW | Y | |
+--------------+-------------------+-------------+-------------------+-----------------------+---------------------+
+--------------+-------------------+-------------+-------------------+-------------------+
| SFRSTCR_PIDM | SFRSTCR_TERM_CODE | SFRSTCR_CRN | SFRSTCR_RSTS_CODE | SFRSTCR_CREDIT_HR |
+--------------+-------------------+-------------+-------------------+-------------------+
| 264185 | 201480 | 82223 | RE | 1 |
| 264185 | 201580 | 80094 | RE | 1 |
| 264185 | 201610 | 10439 | D2 | 0 |
| 264185 | 201680 | 80769 | RW | 3 |
| 264185 | 201680 | 80806 | RW | 3 |
| 264185 | 201680 | 82114 | RW | 3 |
| 264185 | 201680 | 82184 | RW | 3 |
| 264185 | 201710 | 10716 | RW | 3 |
| 264185 | 201710 | 10943 | RW | 3 |
| 264185 | 201710 | 10960 | RW | 3 |
| 264185 | 201710 | 11362 | RW | 3 |
+--------------+-------------------+-------------+-------------------+-------------------+
The data shown is for one PIDM (person).
I need the SUM of SFRSTCR_CREDIT_HR for the rows where SZRATND_ATTENDING_IND = 'Y'
The PIDM, TERM_CODE, CRN, and RSTS_CODEs for both tables must match.
My desired and actual results FOR SZRATND_ATTENDING_IND = 'Y'
+--------------+-------------------+----+-----------------+
| | DESIRED RESULT | | ACTUAL RESULT |
+--------------+-------------------+----+-----------------+
| SFRSTCR_PIDM | ATTENDING_HOURS | | ATTENDING_HOURS |
| 264185 | 0 | | 14 |
+--------------+-------------------+----+-----------------+
Code:
SELECT DISTINCT
F.SFRSTCR_PIDM,
REG.STUDENT_REG_HRS AS STUDENT_REG_HRS,
ATTENDING.ATT_HRS AS STUDENT_ATT_HRS
FROM SFRSTCR F
JOIN (SELECT SFRSTCR_PIDM, SUM(SFRSTCR_CREDIT_HR) AS ATT_HRS
FROM SZRATND ATTEND
JOIN SFRSTCR ON SFRSTCR_PIDM = ATTEND.SZRATND_PIDM
WHERE ATTEND.SZRATND_TERM_CODE = SFRSTCR_TERM_CODE
AND ATTEND.SZRATND_RSTS_CODE = SFRSTCR_RSTS_CODE
AND ATTEND.SZRATND_CRN = SFRSTCR_CRN
AND ATTEND.SZRATND_ATTENDING_IND = 'Y'
GROUP BY SFRSTCR_PIDM) ATTENDING ON F.SFRSTCR_PIDM = ATTENDING.SFRSTCR_PIDM
JOIN (SELECT SF.SFRSTCR_PIDM, SUM(SF.SFRSTCR_CREDIT_HR) AS STUDENT_REG_HRS
FROM SFRSTCR SF
WHERE SF.SFRSTCR_RSTS_CODE LIKE 'R%'
AND SF.SFRSTCR_TERM_CODE = '201710'
GROUP BY SF.SFRSTCR_PIDM)REG ON F.SFRSTCR_PIDM = REG.SFRSTCR_PIDM
WHERE
F.SFRSTCR_RSTS_CODE LIKE 'R%'
AND F.SFRSTCR_TERM_CODE = '201710'
AND F.SFRSTCR_PIDM ='264185'
I have tried several things, but nothing seems to give me the correct results.
This code works to pull the number of hours a student is attending, but when I add the GROUP BY clause, it makes the result incorrect. This is the code that should be in the "ATTENDING join." Any ideas how I can include this?
SELECT NVL(SUM(SFRSTCR_CREDIT_HR), 0) AS ATT_HRS
FROM SFRSTCR
JOIN SZRATND ATTEND ON SFRSTCR_PIDM = ATTEND.SZRATND_PIDM
AND ATTEND.SZRATND_TERM_CODE = SFRSTCR_TERM_CODE
AND ATTEND.SZRATND_ATTENDING_IND = 'Y'
AND ATTEND.SZRATND_RSTS_CODE = SFRSTCR_RSTS_CODE
AND ATTEND.SZRATND_CRN = SFRSTCR_CRN
WHERE SFRSTCR_PIDM ='264185'
AND SFRSTCR_TERM_CODE = '201710'
AND SFRSTCR_RSTS_CODE LIKE 'R%'
FINAL CORRECTED CODE:
SELECT DISTINCT
SPRIDEN_ID AS "ID",
SPRIDEN_LAST_NAME AS "LAST_NAME",
SPRIDEN_FIRST_NAME AS "FIRST_NAME",
ROBUSDF_VALUE_24 AS "FallTNP_Eligibility",
ROBUSDF_VALUE_25 AS "SpringTNP_Eligibility",
ROBUSDF_VALUE_26 AS "SummerTNP_Eligibility",
F.SFRSTCR_TERM_CODE AS "ENROLLED_TERM",
REG.STUDENT_REG_HRS AS STUDENT_REG_HRS,
ATT.ATT_HRS AS STUDENT_ATT_HRS
--CASE WHEN REG.STUDENT_REG_HRS <> ATT.ATT_HRS THEN 'LOOK' END AS "LOOK"
FROM SFRSTCR F
JOIN SPRIDEN ON F.SFRSTCR_PIDM = SPRIDEN_PIDM
LEFT OUTER JOIN ROBUSDF ON SPRIDEN_PIDM = ROBUSDF_PIDM
AND ROBUSDF_VALUE_36 = 'Y'
AND ROBUSDF_AIDY_CODE = :AidYear.AidYear
LEFT JOIN( SELECT NVL( SUM(SFRSTCR_CREDIT_HR), 0) AS ATT_HRS, SFRSTCR_PIDM AS ATT_PIDM
FROM SFRSTCR
JOIN SZRATND ATTEND ON SFRSTCR_PIDM = ATTEND.SZRATND_PIDM
AND ATTEND.SZRATND_TERM_CODE = SFRSTCR_TERM_CODE
AND ATTEND.SZRATND_ATTENDING_IND = 'Y'
AND ATTEND.SZRATND_RSTS_CODE = SFRSTCR_RSTS_CODE
AND ATTEND.SZRATND_CRN = SFRSTCR_CRN
WHERE
SFRSTCR_TERM_CODE IN (:Term.TermCode,:Term.TermCode + 9)
AND SFRSTCR_RSTS_CODE LIKE 'R%'
GROUP BY SFRSTCR_PIDM
) ATT ON F.SFRSTCR_PIDM = ATT.ATT_PIDM
JOIN (SELECT SF.SFRSTCR_PIDM, SUM(SF.SFRSTCR_CREDIT_HR) AS STUDENT_REG_HRS
FROM SFRSTCR SF
WHERE SF.SFRSTCR_RSTS_CODE LIKE 'R%'
AND SF.SFRSTCR_TERM_CODE IN (:Term.TermCode,:Term.TermCode + 9)
GROUP BY SF.SFRSTCR_PIDM)REG ON F.SFRSTCR_PIDM = REG.SFRSTCR_PIDM
WHERE
SPRIDEN_CHANGE_IND IS NULL
AND F.SFRSTCR_RSTS_CODE LIKE 'R%'
AND F.SFRSTCR_TERM_CODE IN (:Term.TermCode,:Term.TermCode + 9)
AND ROBUSDF_VALUE_36 = 'Y'
ORDER BY SPRIDEN_ID
Thorsten Kettner, you are the best! Thank you for your patience!
ATTEND.SZRATND_RSTS_CODE = SFRSTCR.SZRATND_RSTS_CODEin yourONclause? It would alaso read better to haveATTEND.SZRATND_TERM_CODE = SFRSTCR.SZRATND_TERM_CODEinstead ofATTEND.SZRATND_TERM_CODE = '201710'in the clause. (And it enhances maintainability, as you'd have to change the code in only one place, if you wanted another.)AND SFRSTCR_TERM_CODE = '201710' AND SFRSTCR_RSTS_CODE LIKE 'R%'.)