Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 每个GROUP BY表达式必须至少包含一个非外部引用的列_Sql Server_Tsql - Fatal编程技术网

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上设置答案的格式。