在Oracle中按别名分组

时间:2015-02-11 21:26:00

标签: sql oracle group-by oracle10g

example

我需要获得所有州(1,2,3,4)没有重复。

1 xxx
2 yyy
3 zzz
4 jjj

我的第一个也是唯一的想法就是让所有州和他们分组:

select state1 as state,desc1 as desc from table where id=X
Union
select state2 as state,desc2 as desc from table where id=X

这个例子中有6行。因此,为了丢弃副本,我尝试使用别名:

select state,desc from 
(
select state1 as state,desc1 as desc from table where id=X
    Union
    select state2 as state,desc2 as desc from table where id=X
)
group by state;

但我得到的错误不是GROUP BY表达式。

我看到了类似的问题,但我无法解决问题。

3 个答案:

答案 0 :(得分:5)

所有选择列表项都必须位于组中,或者是聚合。您可以在group-by子句中包含state, desc,但使用distinct会更简洁;但是,union(没有all)无论如何都会抑制重复,所以这里都不需要。

正如Bluefeet在其他地方提到的,desc是一个关键字,在order-by子句中有意义,因此它不是列或别名的好名称。

这有四行,而不是六行:

select state1 as state_x, desc1 as desc_x from t42 where id = 'X'
union
select state2 as state_x, desc2 as desc_x from t42 where id = 'X';

| STATE_X | DESC_X |
|---------|--------|
|       1 |    xxx |
|       2 |    yyy |
|       3 |    zzz |
|       4 |    jjj |

SQL Fiddle。不清楚为什么你认为你得到六行,或者你真正做的不同。

答案 1 :(得分:3)

UNION应删除任何重复项。如果没有,那么你应该检查数据 - 也许你在文本列中有额外的空格。

尝试这样的事情。

select state1 as state,TRIM(desc1) as desc from table where id=X
Union
select state2 as state,TRIM(desc2) as desc from table where id=X

答案 2 :(得分:2)

您的第一个查询可能无法正常工作,因为 desc1 desc2 列具有不同的类型,例如 char(10) char(20)。这是来自SQL Fiddle的example,它显示了这种效果。如果您在左窗格中将 char(20)更改为 char(10),则查询将起作用。