Sql Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式
假设我们有两张桌子Sql Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式,sql,oracle,group-by,Sql,Oracle,Group By,假设我们有两张桌子 table1 ---------------------- |ID | Date | ---------------------- |1 |20110101| |1 |20110102| |1 |20110103| |2 |20110102| |2 |20110103| |2 |
table1
----------------------
|ID | Date |
----------------------
|1 |20110101|
|1 |20110102|
|1 |20110103|
|2 |20110102|
|2 |20110103|
|2 |20110104|
----------------------
table2
----------------------
|ID2 |val |
----------------------
|1 |152 |
|2 |155 |
----------------------
使用此查询
SELECT * FROM table1, table2
WHERE table1.ID = table2.ID2
GROUP BY table1.ID
ORDER BY DATE DESC
Mysql应该返回这个
-------------------------------------------
|ID |date |ID2 |val |
-------------------------------------------
|1 |20110103|1 |152 |
|2 |20110104|2 |155 |
-------------------------------------------
在Oracle中,我遇到以下错误:
ORA-00979:不是表达式分组
编辑:
列Date
上的MAX
函数不起作用,因为该列是varchar(200)
数据库/表结构不是我的,我无法更改它。请按以下方式尝试:
SELECT *
FROM table1
LEFT JOIN table2
ON table1.ID = table2.ID
ORDER BY DATE DESC
GROUP BY table1.ID
请按以下方式尝试:
SELECT *
FROM table1
LEFT JOIN table2
ON table1.ID = table2.ID
ORDER BY DATE DESC
GROUP BY table1.ID
在带有group by的SQL语句的select and order by子句中,只能使用group by或其他列的聚合函数(min、max、avg..)中使用的列/表达式
我知道oracle的这一点,我有点惊讶,MySQL中的这一点与group by的SQL语句的select and order by子句中的有所不同。您只能使用group by中使用的列/表达式或其他列的聚合函数(min、max、avg…)
我知道这是针对oracle的,我有点惊讶于MySQL中的情况有所不同。oracle中的Group by意味着您试图在其中一列上运行聚合函数(sum、count等)。看起来您只是希望先按ID然后按日期订购。我会这样做:
SELECT *
FROM table1
JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
DATE DESC
如果这不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都位于group子句中
编辑
针对该评论:
最好先将表1作为子查询进行筛选,然后连接到表2:
SELECT *
FROM (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC
oracle中的Group by表示您正试图对其中一列运行聚合函数(sum、count等)。看起来您只是希望先按ID然后按日期订购。我会这样做:
SELECT *
FROM table1
JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
DATE DESC
如果这不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都位于group子句中
编辑
针对该评论:
最好先将表1作为子查询进行筛选,然后连接到表2:
SELECT *
FROM (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC
一般来说,将
select*from
与groupby
结合使用是个坏主意。select子句中的表达式需要是标量表达式,也就是说,要么是group的聚合函数,要么与group无关,要么是group by子句本身<代码>选择*几乎可以保证不会出现这种情况。你可能想要这样的东西:
select t1.id, max(t1.date), t2.id, max(t2.val)
from table1 t1
join table2 t2 on t1.id=t2.id
group by t1.id
order by max(t1.date) desc
一般来说,将
select*from
与groupby
结合使用是个坏主意。select子句中的表达式需要是标量表达式,也就是说,要么是group的聚合函数,要么与group无关,要么是group by子句本身<代码>选择*几乎可以保证不会出现这种情况。你可能想要这样的东西:
select t1.id, max(t1.date), t2.id, max(t2.val)
from table1 t1
join table2 t2 on t1.id=t2.id
group by t1.id
order by max(t1.date) desc
你需要做两件事中的一件
- 分组并使用聚合函数将多个记录合并为一个记录
- 使用一些查找来确定您想要从组中查找的一条记录
在您的情况下,您不仅仅需要表1中的MAX(),因为可能较高的
id
具有较低的日期。在这种情况下,我倾向于使用查找系统
WITH
ordered_table1 AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
*
FROM
table1
)
SELECT
*
FROM
ordered_table1
INNER JOIN
table2
ON table2.id = ordered_table1.id
WHERE
ordered_table1.sequence_id = 1
注意:这假设您的日期格式为字母数字顺序将产生正确的日期顺序。如果情况并非如此(并且d-m-yyyy
将无法正确下单),则需要将日期字段
替换为截止日期(日期字段)
,以确保正确下单
注意:使用到日期(日期字段)
也可能会解决MAX()问题
注意:如果您想将日期存储为字符串,但为了便于订购,请使用yyyy-mm-dd
您需要做以下两件事之一
- 分组并使用聚合函数将多个记录合并为一个记录
- 使用一些查找来确定您想要从组中查找的一条记录
在您的情况下,您不仅仅需要表1中的MAX(),因为可能较高的id
具有较低的日期。在这种情况下,我倾向于使用查找系统
WITH
ordered_table1 AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
*
FROM
table1
)
SELECT
*
FROM
ordered_table1
INNER JOIN
table2
ON table2.id = ordered_table1.id
WHERE
ordered_table1.sequence_id = 1
注意:这假设您的日期格式为字母数字顺序将产生正确的日期顺序。如果情况并非如此(并且d-m-yyyy
将无法正确下单),则需要将日期字段
替换为截止日期(日期字段)
,以确保正确下单
注意:使用到日期(日期字段)
也可能会解决MAX()问题
注意:如果您想将日期存储为字符串,但为了便于订购,请使用yyyy-mm-dd
这不应该是其中的table1.ID=table2.ID2
?是的,对不起,我忘记写了!!那不应该是table1.ID=table2.ID2吗?是的,对不起,我忘了写了!!是的,但这样我就得到了同一ID的多行,因为和ID可以有多个“日期”。。我只需要1行ID,所以使用MYSQL我使用了group by,它只返回了我的1record@Marcx-你的评论让我困惑,你是使用MySQL还是ORACLE?它们的行为不同,允许不同的语法,并且有不同的运算符可供使用……我使用的是Oracle。日期列是varchar,所以我不能使用max()。这个答案有max(TO_date(date))
。使用TO_DATE()应该允许MAX()按照您的意愿进行操作。使用选择不同的ID,MAX(TO_DATE(DATE,'yyyyymmdd'))从表1中返回一个ORA-00937:没有一个组函数
,顺便说一句,MAX(TO_DATE())函数非常有效,除非我没有选择ID…Ye