Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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 - Fatal编程技术网

Sql 使用多个联接获得正确的和

Sql 使用多个联接获得正确的和,sql,Sql,我正在分析我所在大学的吞吐量数据。现在,我正在收集背景变量,包括SAT考试分数的学历等级,以及被认为与学业成绩相关的不同高中课程的成绩 我还应该在课程开始时计算累计的学术学分,这已经证明有点麻烦了 我的质询如下: SELECT PNR, ZIPCODE, SEL_CRITERION_ID, SR.QUAL_RATING, QUEUENUMBER, PROGRAM_ID, DUC.COURSE_ID, DUC.MARK, SR.COURSEOFFERING_ID, SR.ADMISSIONROU

我正在分析我所在大学的吞吐量数据。现在,我正在收集背景变量,包括SAT考试分数的学历等级,以及被认为与学业成绩相关的不同高中课程的成绩

我还应该在课程开始时计算累计的学术学分,这已经证明有点麻烦了

我的质询如下:

SELECT PNR, ZIPCODE, SEL_CRITERION_ID, SR.QUAL_RATING, QUEUENUMBER, 
PROGRAM_ID, DUC.COURSE_ID, DUC.MARK, SR.COURSEOFFERING_ID, SR.ADMISSIONROUND_ID, RESULT, SR.WITHIN_PROGRAM , SUM(C.CREDIT)
FROM DATABASE.PERSON P 
LEFT JOIN DATABASE.PERSON_ADDRESS PA ON P.PERSON_ID=PA.PERSON_ID 
LEFT JOIN DATABASE.DIPLOMA DU ON P.PERSON_ID=DU.PERSON_ID 
LEFT JOIN DATABASE.DIPLOMA COURSE DUC ON DU.DIPLOMA_UPSEC_ID=DUC.DIPLOMA_UPSEC_ID 
LEFT JOIN DATABASE.SINGLE_COURSE_QUAL SUCQ ON SUCQ.PERSON_ID=P.PERSON_ID
LEFT JOIN DATABASE.PICKED_COURSE PCO ON P.PERSON_ID=PCO.PERSON_ID  
LEFT JOIN DATABASE.SEL_RESULT SR ON P.PERSON_ID=SR.PERSON_ID AND 

SR.COURSEOFFERING_ID=PCO.COURSEOFFERING_ID AND SR.ADMISSIONROUND_ID=PCO.ADMISSIONROUND_ID 
    LEFT JOIN DATABASE.COURSE_REG_QUAL CRQ ON SR.PERSON_ID=CRQ.PERSON_ID
    LEFT JOIN DATABASE.COURSE C ON CRQ.EDUCATIONORG_ID=C.EDUCATIONORG_ID AND CRQ.COURSE_ID=C.COURSE_ID
    WHERE SR.COURSEOFFERING_ID='97114' 
        AND SR.ADMISSIONROUND_ID='AT2018' 
        AND RESULT=20 
        AND     (
                DUC.COURSE_ID='SV1201' 
                OR DUC.COURSE_ID ='COURSE1'
                OR DUC.COURSE_ID ='COURSE2' 
                OR DUC.COURSE_ID ='COURSE3'
                OR DUC.COURSE_ID IS NULL)
    GROUP BY PNR, ZIPCODE, SEL_CRITERION_ID, SR.QUAL_RATING, QUEUENUMBER, 
    UPSEC_ID, DUC.COURSE_ID, DUC.MARK, SR.COURSEOFFERING_ID, SR.ADMISSIONROUND_ID, RESULT, SR.WITHIN_PROGRAM
    ORDER BY PNR
由于有多个可能的资格选择结果值,因此每人至少生成两行。由于course_ID有三个可能的值,因此总共有六行

当然,每个人的学术学分加起来是6倍,尽管这并不一致,这使得计算不可靠

我需要一些方法来获得每次观察的一个正确的学术学分。只要每个人的总和是正确的,我可以让同一个总和连续重复六次

我一直在看,上面写着:

,    <earlier columns>     ,    (   select SUM(payments.amount) 
         from payments 
         where payments.orderID = orders.id
     ) AS totalPayments ,    <later columns>
但是我还不能很好地概括,我无法理解为什么可以在WHERE语句中使用地址,而FROM语句中还没有指定地址。这似乎不适用于我们的系统

子查询思想未经测试


您可以只对求和使用子查询,然后将该子查询连接到查询的其余部分。或者我认为你可以使用窗口功能。可能选择sumcredit而不是person_id分区,或者可能选择PNR分区-我不确定是什么标识了一个人。我们的数据库似乎运行的是一个旧系统,我不确定什么会起作用。不过,子查询似乎是一个安全的选项。从你的措辞来看,我想我应该把它放在From声明中?PNR和PERSON_ID都可以唯一标识一个人,但PERSON_ID只是此数据库的内部编号,而PNR可以用于与其他数据库中的相同人员进行交叉引用。我尝试使用CTEs,但系统未批准。我可能做错了什么,但话说回来,这个系统可能太旧了。好吧,我要到星期一才能真正测试它,以免我再回来多呆几个小时,但我会给你回复的!isnullCR.CREDITS,0表示什么?它提供什么功能?如果一个人没有信用,他们将不会出现在子查询中。因为它使用的是左连接,所以该人员仍将在总体结果中列出,但积分将为空。如果你不想要任何没有信用的人,你可以使用内部连接代替。isnullCR.CREDITS,0等于return CR.CREDITS,除非它为null-在这种情况下,返回0而不是null。我使用了另一个变体,但基于您的子查询思想,它似乎可以工作:
SELECT PNR, isnull(CR.CREDITS,0) AS CREDITS,
   ...
FROM DATABASE.PERSON P
LEFT OUTER JOIN (
   SELECT CRQ.PERSON_ID, SUM(C.CREDIT) AS CREDITS
   -- I'm not really sure how to associate a person with the credits
   -- but hopefully you'll get the idea here.
   FROM DATABASE.PICKED_COURSE PCO
   INNER JOIN DATABASE.COURSE_REG_QUAL CRQ on CRQ.COURSE_ID=C.COURSE_ID
   GROUP BY CRQ.PERSON_ID
) CR on CR.PERSON_ID = P.PERSON_ID
LEFT JOIN DATABASE.PERSON_ADDRESS PA ON P.PERSON_ID=PA.PERSON_ID 
LEFT JOIN DATABASE.DIPLOMA DU ON P.PERSON_ID=DU.PERSON_ID 
...