SQL SUM и CASE и DISTINCT - PullRequest
       2

SQL SUM и CASE и DISTINCT

8 голосов
/ 30 июня 2011

Я пытался повторить это утверждение, но безрезультатно.

SELECT b.Program AS Program,
    SUM(CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males,    
    SUM(CASE WHEN a.Gender LIKE 'F%' THEN 1 ELSE NULL END) AS Females,
    SUM(CASE WHEN e.Activity LIKE 'Arts' THEN 1 ELSE NULL END) AS Arts,
    AVG(CASE WHEN a.Gender LIKE 'M%' THEN CAST(f.Score AS DEC(10,2)) ELSE NULL END)
AS MalesAverage
FROM tblChildren a
    LEFT JOIN tblInvolvement b ON b.ChildID = a.ChildID
    LEFT JOIN tblActivities e ON e.ChildID = b.ChildID
    LEFT JOIN tblScores f ON f.ChildID = b.ChildID
WHERE b.Place = 'Location'
    AND b.Program = 'Program'
    AND b.Year = '2009-10'
    AND f.Assessment LIKE '%Pre%Assessment%'
    AND e.StudentID = b.StudentID
GROUP BY Program

Теперь я получу результаты как:

Program Males Females Arts MalesAverage
---------------------------------------
Program 7     5       1    50.000000

Проблема в том, что есть только 4 мужчины и 3 женщины, и что, когда я добавляю tblActivites, это, кажется, дает дубликаты. После просмотра я заметил, что в таблице «Деятельности» было 12 идентификаторов ChildID. Причина в том, что эти Дети были привязаны к более чем одному виду деятельности. Я пытался использовать что-то вроде:

SELECT SUM( DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males

Однако он только что вернул 1 в столбце «Мужчины». Любая помощь будет оценена. И просто чтобы уточнить, таблицы объединяются с помощью ChildID, мне просто нужна помощь, чтобы убедиться, что я возвращаю правильную информацию. Если это будет решено, то мой огромный список этих вещей будет решен. Избегать использования GROUP BY для всего, потому что у меня много данных.

Ответы [ 2 ]

17 голосов
/ 30 июня 2011

Будет ли это работать?

COUNT(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN a.ChildID ELSE NULL END) AS Males

Я подозреваю, что есть общие способы сделать объединение в целом, но, не зная намного больше о схеме, я действительно не знаю.

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

Вы не показываете исходные данные, но я готов поспорить, что у вас есть несколько строк на человека на программу.

Вы GROUP BY Program, которые агрегируются для каждой программы, ноесли, скажем, John Smith имеет две строки с этим идентификатором программы, он будет засчитан как MALE дважды.

Пожалуйста, покажите нам структуру вашей таблицы, чтобы мы могли дать вам более четкий запрос.В идеале вы получите счет из подвыбора, используя GROUP BY для чего-то вроде Person_ID, чтобы вы не получили повторяющиеся значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...