在oracle中应用group by子句时,如何获取不同的非聚合列以及聚合列?

时间:2017-09-13 08:54:21

标签: sql oracle

select sum(col1), distinct col2 from table group by col1;

以上查询失败。如果组中的所有值都是唯一的,是否有替代方法可以获得不同的值?

对于ex 1(如果col2中的值相同):

|col1 | col2 |
|-----|------|
|1    |  2   |
|1    |  2   |

输出应为:

|col1(sum) |col2 |
|----------|-----|
|    2     |  2  |

ex 2(如果col2中的值不同):

|col1 | col2 |
|-----|------|
|1    |  2   |
|1    |  3   |

输出应为:

|col1(sum) | col2 |
|----------|------|
|    2     |'...' |

2 个答案:

答案 0 :(得分:0)

执行GROUP BY col1

如果只有一个不同的col2值(对于该col1组),则有一个case表达式返回col2。)Othwerwise返回-999(或您选择的任何其他值)。

select sum(col1),
       case when count(distinct col2) = 1 then max(col2)
            else -999
       end
from t
group by col1

答案 1 :(得分:0)

DISTINCT不是应用于单个列的操作 - 它适用于所有列,并且在聚合的上下文中没有意义。

  

输出应为:

col1(sum) col2
2         '...'

您可以使用case语句来获取所需的输出,但您需要使case语句中的所有输出具有相同的数据类型;所以,如果你想要...时有多个值,那么你需要将你的数字转换成一个字符串:

SELECT SUM( col1 ),
       CASE
       WHEN COUNT( DISTINCT col2 ) = 1
       THEN TO_CHAR( MAX( col2 ) )
       ELSE '...'
       END
FROM   your_table
GROUP BY col1