2011-06-16 168 views
0

我遇到的问题似乎来自我的where子句和硬编码。 我有两个表,一个是ID,另一个是ID和ID。SQL WHERE子句问题

所以我的代码看起来有点像这样:

SELECT AVG(CAST(c.Score AS DEC(10,2))) AS avgTestC, 
     AVG(CAST(d.Score AS DEC(10,2))) AS avgTestD, 
     AVG(CAST(e.Score AS DEC(10,2))) AS avgTestE, 
     AVG(CAST(f.Score AS DEC(10,2))) AS avgTestF, 
     COUNT(DISTINCT c.ID) AS CountC, 
     COUNT(DISTINCT d.ID) AS CountD, 
     COUNT(DISTINCT e.ID) AS CountE, 
     COUNT(DISTINCT f.ID) AS CountF 
FROM tblWithIds a, 
    JOIN tblScores b ON a.ID = b.ID AND b.Year = @Year 
    LEFT JOIN tblScores c ON a.ID = c.ID AND c.Year = @Year 
    LEFT JOIN tblScores d ON a.ID = d.ID AND d.Year = @Year 
    LEFT JOIN tblScores e ON a.ID = e.ID AND e.Year = @Year 
    LEFT JOIN tblScores f ON a.ID = f.ID AND f.Year = @Year 
WHERE c.TestC = 'Test C' 
     d.TestD = 'Test D' 
     e.TestE = 'Test E' 
     f.TestF = 'Test F' 

现在的问题是,当我增加更多的where子句和几乎相同的“测试” where子句,它给了我NULL值COUNT的一切和0。上面的代码正常工作,但我使用的测试名称非常相似,表格做得很差,因此所有“测试”名称都在一列中。我无法调试,因为现在我被困在MSSQL 05中。请帮忙!

编辑:使用下面的聚合函数SUM从EricZ越来越之后,如果任何人有兴趣我发现

AVG(CASE WHEN b.Test = 'Test D' THEN CAST(b.Score AS DEC(10,2)) ELSE NULL END) AS avgTestC 

是对AVG聚合函数的正确形式。

回答

0

您可以使用CASE做COUNT,并且只需要连接表一旦

SELECT 
     AVG(CAST((CASE WHEN b.TestC = 'Test C' THEN b.Score ELSE 0 END) AS DEC(10,2))) AS avgTestC, 
     AVG(CAST((CASE WHEN b.TestD = 'Test D' THEN b.Score ELSE 0 END) AS DEC(10,2))) AS avgTestD, 
     AVG(CAST((CASE WHEN b.TestE = 'Test E' THEN b.Score ELSE 0 END) AS DEC(10,2))) AS avgTestE, 
     AVG(CAST((CASE WHEN b.TestF = 'Test F' THEN b.Score ELSE 0 END) AS DEC(10,2))) AS avgTestF,    
     SUM(CASE WHEN b.TestC = 'Test C' THEN 1 ELSE 0 END) AS CountC, 
     SUM(CASE WHEN b.TestD = 'Test D' THEN 1 ELSE 0 END) AS CountD, 
     SUM(CASE WHEN b.TestE = 'Test E' THEN 1 ELSE 0 END) AS CountE, 
     SUM(CASE WHEN b.TestF = 'Test F' THEN 1 ELSE 0 END) AS CountF 
FROM tblWithIds a, 
JOIN tblScores b ON a.ID = b.ID AND b.Year = @Year 
+0

这可以工作,但是你并没有将AVG放在那里。我不确定如何解决平均部分。 – jnewkirk 2011-06-16 15:55:41

+0

@ Newkirk21我使用AVG更新了查询 – EricZ 2011-06-16 16:19:23

+0

谢谢大声笑我实际上已经在指定的时间计算出来了:P但它的工作原理和感谢! – jnewkirk 2011-06-16 16:27:13

0

用例,而不是

SELECT SUM(CASE WHEN Something > 0 THEN Something ELSE 0 END) AS A, SUM(CASE WHEN Something2 > 0 THEN Something2 ELSE 0 END) AS B 
+0

我想不使用递归为了完成任务,我需要在结果中包含所有平均“得分”,为了做到这一点,我需要能够从所有测试中获得“得分”。 – jnewkirk 2011-06-16 15:23:42

+0

它不递归。它的集合逻辑。您可以使用AVG或其他任何聚合函数 – 2011-06-16 15:25:42

+0

对不起,我误解了你想要传达的内容谢谢,EricZ只是把它放在5年前的标准中,所以我可以理解。 – jnewkirk 2011-06-16 16:03:49