我在这里做错了什么?我收到此错误:
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)
我想按第一列,第二列和第三列进行分组。
没有小组的支持就可以了。
答案 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()[即外部引用]。
当用相应的表中的日期列替换它时,它被清除。
想分享一个简单的例子。干杯;)