每个GROUP BY表达式必须至少包含一个不是外部引用的列

时间:2010-12-15 18:30:35

标签: 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), 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 个答案:

答案 0 :(得分:25)

首先,你不能这样做:

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

答案 1 :(得分:16)

好吧,正如之前所说的那样,你不能GROUP文字,我认为你很困惑,因为你可以{1,2}增加1,2,3。当你使用函数作为你的列,您需要通过相同的表达式GROUP。此外,HAVING子句是错误的,你只能使用agreggations中的内容。在这种情况下,您的查询应该是这样的:

ORDER

答案 2 :(得分:11)

您不能按文字分组,只能按列分组。

你可能正在寻找这样的东西:

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列名称。然后,您必须按表达式指定组中列的名称。

答案 3 :(得分:0)

当您使用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)

修改 我在这里要做的是group by,所有字段都是rid。如果这不是您想要的,那么为了获得有效的SQL语句,您需要做的是按字段为每个被删除的组添加聚合函数调用...

答案 4 :(得分:0)

我认为您没有正确使用GROUP BY。

GROUP BY的要点是在执行数学/聚合函数之前,将表组织成基于某一列或多列的部分。

例如,在此表中:

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

SELECT语句可以是GROUP BY名称(Bob,Sally和John各自是独立的组),Age(Bob将是一个组,Sally和John将是另一个组),或Salary(与名称几乎相同的结果)

按“1”分组没有任何意义,因为“1”不是列名。

答案 5 :(得分:0)

这是一个简单的查询,用于查找药品类型为A且超过2的公司名称。

SELECT CNAME 
FROM COMPANY 
WHERE CNO IN (
    SELECT CNO 
    FROM MEDICINE 
    WHERE type='A' 
    GROUP BY CNO HAVING COUNT(type) > 2
)

答案 6 :(得分:0)

我刚发现这个错误。,在select查询中的group by子句中使用GETDATE()[即外部引用]。

当用相应的表中的日期列替换它时,它被清除。

想分享一个简单的例子。干杯;)