列聚合函数,用于确定所有值是否等于Sybase IQ中的常量

时间:2013-11-11 14:51:41

标签: sql sybase sybase-iq

我正在尝试编写一个函数来聚合一个非常大的Sybase IQ表中的某些文本数据列。我无法更改所提供数据的格式。

每一行代表一个有点像测试的过程的值。密钥是非唯一的,值也是文本字符串,只能“通过”或“失败”。

在实际的表中可能有多个“Value”列 - 但为了简洁,我只展示了一个。

规则是如果一切都通过了密钥,那么它就是一个通行证。否则就是失败。在一个理想的世界里,我希望能够编写一个类似的聚合函数:

count(all(mytable.value == 'pass'))

以下是数据示例:

| Key | Value | 
| A   | fail  |
| A   | pass  |
| B   | pass  |
| B   | pass  |
| B   | pass  |
| C   | fail  |
| C   | fail  |

汇总数据如下所示:

| Key | Value |
| A   | fail  |
| B   | pass  |
| C   | fail  |

那么有一种优雅的方式吗?

仅供参考,Sybase IQ - 不是常规的Sybase! ; - )

2 个答案:

答案 0 :(得分:2)

我不了解Sybase-IQ,但使用标准SQL可以这样做:

select key, min(value) as value
from mytable
group by key
having sum(case when value = 'pass' then 1 else 0 end) = count(value)
    or sum(case when value = 'fail' then 1 else 0 end) = count(value);

或者使用达米恩的建议:

select key, min(value)
from mytable
group by key
having min(value) = max(value)

答案 1 :(得分:2)

这似乎是最简单的解决方案......

select
  key
  ,sum(case when value = 'pass' then 1 else 0 end) as num_passed
  ,count(*) as num_tests
from mytable
group by key
having num_tests = num_passed