2013-04-26 19 views
1

我有以下列方式检索信息的图myview的基团:显示字符串常量用于具有多个值

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

我所需要的输出如下所示:

​​

其中,如果有是属性(ATTRNAME)的单个值,应该显示它,并且如果属性有多个值(例如,attr3),则应该显示文本“多个值”。

我曾尝试:

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分钟执行的约11000行,这是不正确的一种解决方案。请帮忙!

回答

3

有一种方法更简单:

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

让我知道你是否仍然有性能问题。

+0

应该显示字符串还是值c和d?可能这个问题是针对Rachcha的。 – Art 2013-04-26 17:23:48

+0

@ gustavodidomenico-请不要改变任何东西。我认为我有点困惑,并没有看到Rachcha例子中的字符串。你的例子很完美。 – Art 2013-04-26 17:37:22

+0

但它是错误的,我显示属性名称,而不是属性值:)。谢谢 – gustavodidomenico 2013-04-26 17:47:15

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()要贵一些。

0

SELECT attrname,当COUNT(*)> 1,则 '多值' ELSE TO_CHAR(attrval)END FROM MyView的 GROUP BY attrname

+0

你将不得不在你的GROUP BY中包含TO_CHAR(attrval),它会返回错误的结果。 – Aushin 2013-04-26 14:24:23