显示具有多个值的组的字符串常量

时间:2013-04-26 14:16:25

标签: sql oracle group-by aggregate

我有一个视图myview,它以下列方式检索信息:

ID  | ATTRNAME | ATTRVAL
1   | attr1    | a
2   | attr2    | b
3   | attr3    | c
4   | attr3    | d
..  | ..       | ..
..  | ..       | ..

我需要输出如下:

ATTRNAME | ATTRVAL
attr1    | a
attr2    | b
attr3    | Multiple Values

其中,如果属性(ATTRNAME)有单个值,则应显示该属性,如果属性有多个值(例如attr3),则应显示文本“Multiple Values”。

我试过了:

SELECT DISTINCT attrname
       , CASE cnt
            WHEN 1 THEN TO_CHAR(attrval)
            ELSE 'Multiple Values'
         END AS attrval_rev
FROM   myview
JOIN   (SELECT   attrname, COUNT(attrval) AS cnt
        FROM     myview
        GROUP BY attrname) USING (attrname)

这是有效的,但这不是正确的解决方案,因为它需要花费8分钟来执行大约11,000行。请帮忙!

3 个答案:

答案 0 :(得分:3)

有一种更简单的方法:

SELECT ATTRNAME,
       CASE WHEN COUNT(*) = 1 THEN MIN(attrval) ELSE 'Multiple Values' END
 FROM myview
GROUP BY ATTRNAME

如果您仍然遇到性能问题,请与我们联系。

答案 1 :(得分:2)

试试这个:

select attrname,
       (case when min(attrval) = max(attrval) then min(attrval)
             when min(attrval) is null then null
             else 'Multiple Values'
        end)
from myview
group by attrname

请注意,这会将NULL忽略为有效值。

您也可以将第一个列表设为when count(distinct attrval) = 1,但count(distinct)min()max()贵一点。

答案 2 :(得分:0)

选择attrname,WHEN count(*)> 1然后'多个值'ELSE TO_CHAR(attrval)END 来自myview GROUP BY attrname