Cada GRUPO POR expresión debe contener al menos una columna que no sea una referencia externa


¿Qué estoy haciendo mal aquí? Estoy recibiendo este error en:

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)

Me gustaría agrupar por la primera, segunda y tercera columnas que tienen el máximo rid.

Funciona bien sin el grupo por y tener.

Author: PiotrWolkowski, 2010-12-15

7 answers

Para empezar, no puedes hacer esto:

having rid!=MAX(rid)

La cláusula HAVING solo puede contener cosas que son atributos de los grupos agregados.

Además, 1, 2, 3 no es válido en GROUP BY en SQL Server - creo que solo es válido en ORDER BY.

¿Puedes explicar por qué esto no es lo que estás buscando:

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
 23
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-23 07:07:32

Bueno, como se dijo antes, no puedes GROUP por literales, creo que estás confundido porque puedes ORDER por 1, 2, 3. Cuando utiliza funciones como columnas, necesita AGRUPAR por la misma expresión. Además, la cláusula DE TENER está mal, solo se puede usar lo que está en las agregaciones. En este caso, su consulta debe ser así:

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
 15
Author: Lamak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-15 18:56:32

No se puede agrupar por literales, solo columnas.

Probablemente esté buscando algo como esto:

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)

En primer lugar, debe darle a esa primera expresión un nombre de columna con as. Luego debe especificar los nombres de las columnas en el grupo por expresión.

 9
Author: Femaref,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-15 18:38:38

Creo que no estás usando GROUP BY correctamente.

El punto de AGRUPAR POR es organizar su tabla en secciones basadas en una columna o columnas determinadas antes de realizar funciones matemáticas/agregadas.

Por ejemplo, en esta tabla:

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

Una instrucción SELECT podría AGRUPARSE POR nombre (Bob, Sally y John serían grupos separados), Edad (Bob sería un grupo, Sally y John serían otros), o Salario (casi el mismo resultado que name).

Agrupar por " 1 " no ningún sentido porque "1" no es un nombre de columna.

 0
Author: DGH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-15 18:38:32

Cuando usas GROUP BY, también necesitas usar funciones de agregado para las columnas que no están dentro de tu cláusula group by.

No se exactamente lo que estás tratando de hacer, pero supongo que esto funcionaría:

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)

Editar: Lo que estoy tratando de hacer aquí es un group by con todos los campos excepto rid. Si eso no es lo que desea, lo que necesita hacer para tener una instrucción SQL válida es agregar una llamada a la función aggregate para cada grupo eliminado por campo...

 0
Author: rsenna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-15 19:05:50

Aquí hay una consulta simple para encontrar el nombre de la empresa que tiene un tipo de medicamento de A y hace más de 2.

SELECT CNAME 
FROM COMPANY 
WHERE CNO IN (
    SELECT CNO 
    FROM MEDICINE 
    WHERE type='A' 
    GROUP BY CNO HAVING COUNT(type) > 2
)
 0
Author: vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-08 12:06:31

Acabo de encontrar este error., mientras se usa GETDATE () [es decir, referencia externa] en la cláusula group by en una consulta select.

Cuando se reemplazó con la columna de fecha de la tabla respectiva, se borró.

Pensado para compartir como un simple ejemplo. saludos ;)

 0
Author: Antony raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-21 07:39:15