Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 server SQL WHERE子句问题_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server SQL WHERE子句问题

Sql server SQL WHERE子句问题,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我遇到的问题似乎来自where子句和硬编码。 我有两张表,一张有ID,另一张有ID和ID分数 所以我的代码看起来有点像这样: 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(

我遇到的问题似乎来自where子句和硬编码。 我有两张表,一张有ID,另一张有ID和ID分数

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

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子句时,它为所有内容提供空值,为计数提供0。上面的代码工作正常,但我使用的测试名称非常相似,而且该表制作得很糟糕,因此所有“测试”名称都在一列中。我无法调试,因为我现在无法使用MSSQL 05。请帮忙

编辑:使用EricZ提供的下面的聚合函数SUM后,如果其他人感兴趣,我发现

AVG( CASE WHEN b.Test = 'Test D' THEN CAST(b.Score AS DEC(10,2)) ELSE NULL END) AS avgTestC
是AVG聚合函数的正确形式。

改用用例

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

您可以使用CASE进行计数,只需连接表一次

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

我不想为了完成任务而使用递归,我需要在我的结果中有所有的平均“分数”,为了做到这一点,我需要能够从所有的测试中得到“分数”。这不是递归。这是一套逻辑。你可以使用AVG或任何其他聚合函数,对不起,我误解了你想要表达的意思。谢谢,EricZ只是把它放在5年前的标准中,这样我就可以理解了。这很有效,但是你没有把AVG也放在那里。我不知道如何解决平均部分的问题。谢谢,哈哈,我在分配的时间里就解决了:P,但它很有效,谢谢!