Sql 计算错误没有返回正确的值

Sql 计算错误没有返回正确的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下面的纸条,开始计算返回的值与分组后的值相同。我每所学校都要回27分。所有4种计算方法都是相同的。当我手动查询数据以检查值时,它会返回正确的数据。这一定是我计算的方式。它将按年级统计学生人数和每个熟练程度。任何建议。你们真是太棒了 SELECT DISTINCT t.descript, t.schoolc AS School, -- s.ident AS StdID, --ze.descript, st.grdlvl, -- st.takendt, --CASE td.s

我有下面的纸条,开始计算返回的值与分组后的值相同。我每所学校都要回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

连接中的ON子句到处都是,我只是在下面猜到了,并试图修复它们中的大多数,请参见下面

您在联接中使用了两个
ON
子句如果在联接的ON子句中有多个条件,您应该使用
来指定第二个和第三个条件,但不能多次使用
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

您在testscore上有一个聚合,但在您的组中也有它。您可能需要查看案例表达式中的MAX(testscore)并将其从分组中删除。我们是否应该知道哪个计算给出了错误的值?以及“错误的值”在这里的含义是什么?很抱歉,所有Calc都给出了错误的数据。它们返回的值基本相同27或54。当检查原始数据时,它应该是5,您将大量的表连接在一起,然后使用聚合。这通常意味着您正在沿着不同的维度连接,意外地创建一个小的笛卡尔积。由于没有样本数据或数据布局,很难说除此之外还有什么。请再次注意,您缺乏评分答案。请务必记下约翰的答案。这个网站之所以有效,是因为对于那些提出问题和给出答案的人来说,是互惠互利的。