Использовать group by - PullRequest
       3

Использовать group by

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

Запрос:

  SELECT sd.ident,sd.suniq, testc, subtestc, ts.testscore, 
         metadept, ts.takendt, 
         MAX(takendt) testdate
    FROM studemo sd, stutests ts, testdef td, udefstu ud
   WHERE ts.suniq =sd.suniq
     AND td.testuniq = ts.testuniq
     AND ts.suniq = ud.suniq
     AND td.testuniq IN ('2000089', '2000090', '2000091', '2000092')
GROUP BY sd.suniq
ORDER BY suniq

получить следующую ошибку:

Сообщение 8120, уровень 16, состояние 1, строка 2 Столбец 'studemo.ident' недопустим в выборесписок, потому что он не содержится ни в статистической функции, ни в предложении GROUP BY.

Моя цель - получить самый последний результат теста.Я успешен, пока не попытаюсь добавить больше таблиц, чтобы включить больше информации об ученике.

Ответы [ 4 ]

5 голосов
/ 29 июня 2011

Вам нужно будет добавить столбцы, которых нет в статистической функции, в ваш GROUP BY, чтобы ваш оператор SQL был действительным.

3 голосов
/ 29 июня 2011

Я подозреваю, что вы хотите показать максимальный результат для каждого учащегося, даже если он сдал несколько тестов, например, если они прошли два теста, вы хотите показать обе даты тестирования и в каждой строке также показать максимальную дату.Если это так, то группировка по всем остальным столбцам не поможет.Может быть, попробуйте это, предполагая SQL Server 2005 или более поздней версии:

        WITH md AS
        (
            SELECT ts.suniq, maxdate = MAX(ts.takendt)
                FROM dbo.stutests AS ts
            INNER JOIN
                dbo.testdef AS td
                ON td.testuniq = ts.testuniq
            WHERE
                td.testuniq IN ('2000089', '2000090', '2000091', '2000092')
            GROUP BY ts.suniq
        )
        SELECT
            sd.ident,
            sd.suniq,
            testc, -- which table does this come from? why no prefix?
            subtestc, -- which table does this come from? why no prefix?
            ts.testscore,
            metadept, -- which table does this come from? why no prefix?
            ts.takendt,
            md.maxdate
        FROM
            dbo.studemo AS sd
        INNER JOIN
            dbo.stutests AS ts
            ON sd.suniq = ts.suniq
        INNER JOIN
            dbo.testdef AS td
            ON td.testuniq = ts.testuniq
        INNER JOIN
            dbo.udefstu AS ud
            ON ts.suniq = ud.suniq
        INNER JOIN md
            ON md.suniq = sd.suniq
        WHERE
            td.testuniq IN ('2000089', '2000090', '2000091', '2000092')
        ORDER BY
            sd.suniq; -- you forgot a prefix here too
            -- could cause problems if you change the query later
3 голосов
/ 29 июня 2011
select sd.ident,sd.suniq, testc, subtestc, ts.testscore, metadept, ts.takendt, max(takendt)testdate
from studemo sd, stutests ts, testdef td, udefstu ud
where ts.suniq =sd.suniq
and td.testuniq = ts.testuniq
and ts.suniq = ud.suniq
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092')
group by sd.ident,sd.suniq, testc, subtestc, ts.testscore, metadept, ts.takendt
order by suniq

комментарий: код выше означает, что @Neil означает

2 голосов
/ 29 июня 2011

Вам необходимо добавить оставшиеся поля, не используя функцию агрегирования, к вашему Group By.

    select sd.ident,sd.suniq, testc, subtestc, ts.testscore, metadept, ts.takendt, max(takendt)testdate
from studemo sd, stutests ts, testdef td, udefstu ud
where ts.suniq =sd.suniq
and td.testuniq = ts.testuniq
and ts.suniq = ud.suniq
and td.testuniq IN ('2000089', '2000090', '2000091', '2000092')
group by sd.suniq, sd.ident, testc, subtestc, ts.testscore, metadept, ts.takendt
order by suniq
...