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.
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
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
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.
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.
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...
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
)
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 ;)
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