Sql 计算错误没有返回正确的值
我有下面的纸条,开始计算返回的值与分组后的值相同。我每所学校都要回27分。所有4种计算方法都是相同的。当我手动查询数据以检查值时,它会返回正确的数据。这一定是我计算的方式。它将按年级统计学生人数和每个熟练程度。任何建议。你们真是太棒了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
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,您将大量的表连接在一起,然后使用聚合。这通常意味着您正在沿着不同的维度连接,意外地创建一个小的笛卡尔积。由于没有样本数据或数据布局,很难说除此之外还有什么。请再次注意,您缺乏评分答案。请务必记下约翰的答案。这个网站之所以有效,是因为对于那些提出问题和给出答案的人来说,是互惠互利的。