我有两张桌子:SZRATND和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 |
+--------------+-------------------+-------------+-------------------+-------------------+
显示的数据是一个PIDM(人)
对于SZRATND_ATTENDING_IND =' Y'
的行,我需要SFRSTCR_CREDIT_HR的SUM
两个表的PIDM,TERM_CODE,CRN和RSTS_CODE必须匹配。
我希望和实际的结果对于SZRATND_ATTENDING_IND =' Y'
+--------------+-------------------+----+-----------------+
| | DESIRED RESULT | | ACTUAL RESULT |
+--------------+-------------------+----+-----------------+
| SFRSTCR_PIDM | ATTENDING_HOURS | | ATTENDING_HOURS |
| 264185 | 0 | | 14 |
+--------------+-------------------+----+-----------------+
代码:
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'
我尝试了几件事,但似乎没有什么能给我正确的结果。
此代码用于拉取学生参加的小时数,但是当我添加GROUP BY子句时,它会使结果不正确。这是应该在" ATTENDING加入中的代码。"我有什么想法可以包含这个吗?
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%'
最终更正的代码:
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
答案 0 :(得分:1)
我必须承认我没有看你的查询。它看起来很复杂,而你似乎只想加入表格,然后获得每个attending_ind的credit_hr总和。那将是:
SZRATND_CRN
关于修改过的查询:
ON
条款中似乎有SZRATND
。{/ li>
SFRSTCR_CREDIT_HR
,但不要在查询中的任何位置使用它。你也可以完全删除它。:REG_TERM
和'201710'
。这可能与您在主查询中使用的:REG_TERM
不同。因此,如果SFRSTCR_CREDIT_HR
没有匹配,则会关闭学生的记录。264185|1
进行分组。我不知道为什么。这为您提供了两个总和,一个用于264185|3
,一个用于SFRSTCR_CREDIT_HR
。而且您甚至不显示您显示总和的组(DISTINCT
不在您的选择列表中)。264185|1
通常是编写错误查询的标志。它在这里做的一件事是:如果您找到264185|3
的六个记录和264185|6
的两个记录,那么您将获得264185|6
和atexit.register
(因为1 x 6 = 6和2 x 3 = 6)。在这种情况下,您将其中一行视为重复。对我来说似乎没有意义。