Sql server 每个GROUP BY表达式必须至少包含一个非外部引用的列
我做错了什么?我在以下位置收到此错误:Sql server 每个GROUP BY表达式必须至少包含一个非外部引用的列,sql-server,tsql,Sql Server,Tsql,我做错了什么?我在以下位置收到此错误: 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), 80
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)
我想按最大rid的第一、第二和第三列进行分组
如果没有group by和HAVE,它可以正常工作。您不能按文字分组,只能按列分组 您可能正在寻找类似以下内容:
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)
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
首先,必须为第一个表达式指定一个列名称,列名称为
as
。然后,您必须指定group by表达式中列的名称。当您使用group by
时,还需要对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)
编辑:
这里我要做的是一个
分组依据
,包含所有字段,但rid
。如果这不是您想要的,那么为了获得有效的SQL语句,您需要做的是为每个删除的group by字段添加聚合函数调用…首先,您不能这样做:
having rid!=MAX(rid)
HAVING子句只能包含聚合组的属性
此外,1,2,3
在SQL Server中的GROUP BY中无效-我认为这仅在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
我认为你没有正确地使用分组 GROUP BY的要点是在执行数学/聚合函数之前,根据某一列或多列将表组织为多个部分 例如,在此表中:
Name Age Salary
Bob 25 20000
Sally 42 40000
John 42 90000
SELECT语句可以按姓名分组(Bob、Sally和John分别是不同的组)、年龄分组(Bob是一个组,Sally和John是另一个组)或薪水分组(结果与姓名大致相同)
按“1”分组没有任何意义,因为“1”不是列名。好吧,正如前面所说的,你不能按文本分组,我认为你很困惑,因为你可以按1、2、3排序。使用函数作为列时,需要按相同的表达式分组。此外,HAVING子句是错误的,你只能使用agreegrations中的内容。在这种情况下,您的查询应如下所示:
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)
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
这里有一个简单的查询,可以查找药品类型为a且收入超过2英镑的公司名称
SELECT CNAME
FROM COMPANY
WHERE CNO IN (
SELECT CNO
FROM MEDICINE
WHERE type='A'
GROUP BY CNO HAVING COUNT(type) > 2
)
我在select查询的group by子句中使用GETDATE()[即外部引用]时发现了此错误 将其替换为相应表中的日期列时,它将被清除
作为一个简单的例子与大家分享。干杯;) 谢谢你的帮助。我只想按第一列、第二列和第三列进行分组,。我该怎么做?@herrow:你可以按第一、第二和第三列的名称分组。如果您能用自然语言解释这个查询应该做什么,可能会对我们有所帮助。@dgh我需要它按(左……)分组,它是一个columns@herrow:好的,也许GROUPBY 1有一些我在sql server中不熟悉的特殊含义。但是,我仍然认为按列名分组将更接近您实际需要的内容。我如何按第一列分组?您是否尝试过Cade Roux的建议?e、 g.左分组(……?或者这不是你所说的“第一列”的意思吗?@herrow你不按rid分组,也不在SELECT中用SUM、MIN、MAX等聚合函数将其包围。我仍然不确定你想得到什么……是的,那是因为@Femaref说-你也不能按文字分组。我会编辑我的答案。@herrow:是的,因为我保留了您所犯的错误…>:-@因此,对此表示“抱歉”…请解释您的答案,使其对更多用户有用,并了解如何在stackoverflow上设置答案的格式。