Каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой - PullRequest
30 голосов
/ 15 декабря 2010

Что я здесь не так делаю?Я получаю эту ошибку:

SELECT LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), 
            PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', 
            batchinfo.datapath), 8000))-1),
            qvalues.name,
            qvalues.compound,
            qvalues.rid
FROM batchinfo JOIN qvalues ON batchinfo.rowid=qvalues.rowid
WHERE LEN(datapath)>4
GROUP BY 1,2,3
HAVING rid!=MAX(rid)

Я хотел бы сгруппировать по первому, второму и третьему столбцам с максимальным избавлением.

Он работает нормально без группы по.

Ответы [ 7 ]

25 голосов
/ 15 декабря 2010

Начать с того, что вы не можете сделать это:

having rid!=MAX(rid)

Предложение HAVING может содержать только вещи, которые являются атрибутами совокупных групп.

Кроме того, 1, 2, 3 недопустимо в GROUP BY в SQL Server - я думаю, что это допустимо только в ORDER BY.

Можете ли вы объяснить, почему это не то, что вы ищете:

select 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound,
MAX(qvalues.rid)
 from batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where LEN(datapath)>4
group by LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound
16 голосов
/ 15 декабря 2010

Ну, как уже было сказано, вы не можете GROUP с помощью литералов, я думаю, что вы запутались, потому что вы можете ORDER на 1, 2, 3. Когда вы используете функции в качестве столбцов, вам нужно Группировать по тому же выражению. Кроме того, предложение HAVING неверно, вы можете использовать только то, что в агрегациях. В этом случае ваш запрос должен выглядеть следующим образом:

SELECT 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound,
MAX(qvalues.rid) MaxRid
FROM batchinfo join qvalues 
ON batchinfo.rowid=qvalues.rowid
WHERE LEN(datapath)>4
GROUP BY 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound
11 голосов
/ 15 декабря 2010

Вы не можете группировать по литералам, только по столбцам.

Возможно, вы ищете что-то вроде этого:

select 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1) as pathinfo,
qvalues.name,
qvalues.compound,
qvalues.rid
 from batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where LEN(datapath)>4
group by pathinfo, qvalues.name, qvalues.compound
having rid!=MAX(rid)

Прежде всего, вы должны дать этому первому выражениюимя столбца с as.Затем необходимо указать имена столбцов в группе по выражению.

1 голос
/ 21 апреля 2018

Я только что обнаружил эту ошибку. При использовании GETDATE () [т.е. внешней ссылки] в предложении group by в запросе select.

При замене на столбец даты из соответствующей таблицы он очищается.

Мысль поделиться в качестве простого примера.ура;)

0 голосов
/ 08 ноября 2017

Вот простой запрос, чтобы найти название компании, которая имеет тип лекарства A и составляет более 2.

SELECT CNAME 
FROM COMPANY 
WHERE CNO IN (
    SELECT CNO 
    FROM MEDICINE 
    WHERE type='A' 
    GROUP BY CNO HAVING COUNT(type) > 2
)
0 голосов
/ 15 декабря 2010

Я думаю, что вы не используете GROUP BY должным образом.

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

Например, в этой таблице:

Name    Age   Salary
Bob     25     20000
Sally   42     40000
John    42     90000

Оператор SELECT может иметь имя GROUP BY (каждая Боб, Салли и Джон будут отдельными группами), Возраст (Боб будет одной группой, Салли и Джон другой) или Зарплата (почти такой же результат, как имя) .

Группировка по «1» не имеет никакого смысла, поскольку «1» не является именем столбца.

0 голосов
/ 15 декабря 2010

Когда вы используете GROUP BY, вам также нужно использовать статистические функции для столбцов, не входящих в вашу группу по выражению.

Я не знаю точно, что вы пытаетесь сделать, ноЯ думаю, это будет работать:

select 
    LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000),
    PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
    qvalues.name,
    qvalues.compound,
    MAX(qvalues.rid)
from
    batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where
    LEN(datapath)>4
group by
    LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000),
    PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
    qvalues.name,
    qvalues.compound
having
    rid!=MAX(rid)

Редактировать: Я пытаюсь сделать здесь group by со всеми полями, но rid.Если это не то, что вам нужно, то для того, чтобы иметь действительный оператор SQL, вам нужно добавить агрегированный вызов функции для каждой удаленной группы по полю ...

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