Проблемы с SQL WHERE - PullRequest
       0

Проблемы с SQL WHERE

0 голосов
/ 16 июня 2011

Проблема, которая у меня возникает, кажется, возникла из моего предложения 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 и почти идентичному «Tests» предложению where, он дает мне значения NULL для всего и 0 для COUNT.Приведенный выше код работает правильно, но используемый мной тест имеет очень похожие имена, и таблица была составлена ​​плохо, поэтому все имена «тестов» находятся в одном столбце.Я не могу отладить, поскольку я застрял с использованием 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.

Ответы [ 2 ]

0 голосов
/ 16 июня 2011

Вы можете использовать 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 голосов
/ 16 июня 2011

Используйте CASE вместо

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...