2014-09-05 59 views
0

我有以下scrip和开始计算返回相同的值,它显示它不是在分组之后。我为每所学校返回27。所有4个计算都是一样的。当我手动查询数据以检查值时,它会返回正确的数据。这一定是我做计算的方式。这是按照等级统计学生人数和每个熟练程度。有什么建议么。你这个人很棒。计算错误没有返回正确的值

SELECT DISTINCT 
t.descript, 
t.schoolc AS School, 
-- s.ident AS StdID, 
--ze.descript, 
    st.grdlvl, 
-- st.takendt, 
--CASE td.subtestc WHEN 'LI' THEN 'CELDT Listening' WHEN 'RD' THEN 'CELDT Reading' WHEN 'SP' THEN 'CELDT Speaking' WHEN 'WR' THEN 'CELDT Writing' WHEN 
--    'TO' THEN 'CELDT Overall' ELSE '' END AS ELDassessment, 
CASE st.testscore WHEN '1' THEN 'BE' WHEN '2' THEN ' EI' WHEN '3' THEN 'IN' WHEN '4' THEN 'EA' WHEN '5' THEN 'AD' ELSE '' END AS ProfLevel, 

sum (CASE WHEN (st.testscore) IN ('1') THEN 1 ELSE 0 END) AS [Beginning], 
sum((CASE WHEN (st.testscore) IN ('2') THEN 1 ELSE 0 END)) AS [Early Intermediate], 
SUM(CASE WHEN (st.testscore) IN ('3') THEN 1 ELSE 0 END) AS [Intermediate], 
SUM(CASE WHEN (st.testscore) IN ('4') THEN 1 ELSE 0 END) AS [Early Advanced], 
SUM(CASE WHEN (st.testscore) IN ('5') THEN 1 ELSE 0 END) AS [Advanced] 


FROM   dbo.stustat AS s INNER JOIN 
         dbo.track AS t ON s.trkuniq = t.trkuniq INNER JOIN 
         dbo.stutests AS st ON s.suniq = st.suniq INNER JOIN 
         dbo.xstutests AS xst INNER JOIN 
         dbo.codeassoc AS ca3 ON xst.scrsource = ca3.zcode ON st.ststuniq = xst.ststuniq INNER JOIN 
         dbo.testval AS tv INNER JOIN 
         dbo.testdef AS td INNER JOIN 
         dbo.ztest AS zt INNER JOIN 
         dbo.codeassoc AS ca1 ON zt.testc = ca1.zcode ON td.testc = zt.testc INNER JOIN 
         dbo.zsubtest AS zst ON td.subtestc = zst.subtestc AND td.testc = zst.testc ON td.testuniq = tv.testuniq INNER JOIN 
         dbo.ztscrtyp AS ztscr INNER JOIN 
         dbo.codeassoc AS ca2 ON ztscr.tscrtypc = ca2.zcode ON tv.tscrtypc = ztscr.tscrtypc ON st.testuniq = tv.testuniq AND st.tscrtypc = tv.tscrtypc 
         INNER JOIN studemo sd ON s.ident=sd.ident 
         INNER JOIN dbo.zethnic ze ON sd.ethnicc=ze.ethnicc 
WHERE   
--(st.takendt >= '2013-07-01') 
(tv.tscrtypc = 'A') 
AND (td.subtestc IN ('TO')) 
--AND (t.schoolc IN ('32')) 
    AND t.trkuniq NOT BETWEEN '1'AND '1000066' 
    AND t.trkuniq NOT BETWEEN '1000134' AND '1000156' 
-- AND grdlvl ='0' 
    --AND (st.testscore) IN ('1') 

    GROUP BY 
    t.descript, 
    td.subtestc, 
    st.testscore, 
t.schoolc , 
s.ident , 
--ze.descript, 
    st.grdlvl 
-- st.takendt 

    ORDER BY t.descript, t.schoolc,st.grdlvl 
+0

你在testscore上有一个聚合,但你也在你的组中。您可能需要查看您的案例表达式中的MAX(testscore),并将其从组中删除。 – 2014-09-05 18:24:04

+0

我们是否应该知道**哪个**计算给出了错误的值?以及这里的“错误值”是什么意思? – Lamak 2014-09-05 18:24:22

+0

抱歉,所有的数据都给出了错误的数据。他们返回的值大部分是27或54。当检查原始数据时,它应该是5 – 2014-09-05 18:27:36

回答

0

您的条款在您的连接是所有的地方,我只以下猜测,并试图修复他们大多见下文

你用了两个ON条款中,如果你有一个以上联接在JOIN的ON子句中有一个条件,您应该使用AND来提到第二,第三个条件,但是您不要多次使用ON来指定ON子句中的多个条件。

对于像这样的大规模查询,适当的缩进使编写/调试/修改代码更容易。

SELECT DISTINCT 
       t.descript 
       ,t.schoolc AS School 
       --,s.ident AS StdID 
       --,ze.descript 
       ,st.grdlvl 
       --,st.takendt 
       --,CASE td.subtestc WHEN 'LI' THEN 'CELDT Listening' 
           --WHEN 'RD' THEN 'CELDT Reading' 
           --WHEN 'SP' THEN 'CELDT Speaking' 
           --WHEN 'WR' THEN 'CELDT Writing' 
           --WHEN 'TO' THEN 'CELDT Overall' ELSE '' END AS ELDassessment 
       --,CASE st.testscore WHEN '1' THEN 'BE' 
            --WHEN '2' THEN ' EI' 
            --WHEN '3' THEN 'IN' 
            --WHEN '4' THEN 'EA' 
            --WHEN '5' THEN 'AD' ELSE '' END AS ProfLevel 
       ,sum (CASE WHEN (st.testscore) IN ('1') THEN 1 ELSE 0 END) AS [Beginning] 
       ,sum((CASE WHEN (st.testscore) IN ('2') THEN 1 ELSE 0 END)) AS [Early Intermediate] 
       ,SUM(CASE WHEN (st.testscore) IN ('3') THEN 1 ELSE 0 END) AS [Intermediate] 
       ,SUM(CASE WHEN (st.testscore) IN ('4') THEN 1 ELSE 0 END) AS [Early Advanced] 
       ,SUM(CASE WHEN (st.testscore) IN ('5') THEN 1 ELSE 0 END) AS [Advanced] 

FROM dbo.stustat AS s 
INNER JOIN dbo.track AS t  ON s.trkuniq = t.trkuniq 
INNER JOIN dbo.stutests AS st ON s.suniq = st.suniq 
INNER JOIN dbo.xstutests AS xst ON st.ststuniq = xst.ststuniq 
INNER JOIN dbo.codeassoc AS ca3 ON xst.scrsource = ca3.zcode 
INNER JOIN dbo.testval AS tv ON st.testuniq = tv.testuniq AND st.tscrtypc = tv.tscrtypc 
INNER JOIN dbo.testdef AS td ON td.testuniq = tv.testuniq 
INNER JOIN dbo.ztest AS zt  ON td.testc = zt.testc 
INNER JOIN dbo.codeassoc AS ca1 ON zt.testc = ca1.zcode 
INNER JOIN dbo.zsubtest AS zst ON td.subtestc = zst.subtestc AND td.testc = zst.testc 
INNER JOIN dbo.ztscrtyp AS ztscr ON tv.tscrtypc = ztscr.tscrtypc 
INNER JOIN dbo.codeassoc AS ca2 ON ztscr.tscrtypc = ca2.zcode 
INNER JOIN studemo sd   ON s.ident=sd.ident 
INNER JOIN dbo.zethnic ze  ON sd.ethnicc=ze.ethnicc 
WHERE (tv.tscrtypc = 'A')  
    AND (td.subtestc IN ('TO')) 
    AND t.trkuniq NOT BETWEEN '1'AND '1000066' 
    AND t.trkuniq NOT BETWEEN '1000134' AND '1000156' 
-- AND (st.takendt >= '2013-07-01') AND (t.schoolc IN ('32')) 
-- AND grdlvl ='0' AND (st.testscore) IN ('1') 
GROUP BY t.descript 
     ,t.schoolc 
     --,s.ident 
     --,ze.descript 
     ,st.grdlvl 
ORDER BY t.descript, t.schoolc,st.grdlvl