选择组中的所有行,其中一列具有一个特定值,另一列具有另一个特定值

时间:2013-01-18 10:38:47

标签: sql select group-by db2 grouping

我是SQL的新手,所以我不确定哪种方法最适合这种任务:

我有一个表,其中行组都与同一项相关,其名称显示在第一列中。其他详细信息显示在其他列中。我试图根据第一列中的相同值检索每个组的所有行,其中每次某个值出现在一列中,另一个值出现在下一行的不同列中。

 | Fruit  | Value1| Value2|
 --------------------------
 | APPLE  |  A    |       |
 | APPLE  |       | E     |
 | PEAR   |  A    |       |
 | PEAR   |       | X     |
 | FIG    |       | X     |
 | FIG    |  A    |       |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | GRAPE  |       | X     |
 | GRAPE  |       | T     |
 | ORANGE |  A    |       |
 | ORANGE |       | X     |
 | ORANGE |       | Y     |
 | ORANGE |       | Z     |
 | PEACH  |  B    |       |
 | PEACH  |  A    |       |
 | PEACH  |       | X     |
 | MANGO  |  B    |       |
 | MANGO  |  C    |       |
 | MANGO  |  D    |       |

从上表中,我想选择给定Fruit的所有行,其中Value1在一行上是A,Value2在下一行是X,除了A之外的任何内容都出现在该Fruit的任何行的Value1中

从上表中,查询应该提供如下所示的结果:

 | Fruit  | Value1| Value2|
 --------------------------
 | PEAR   |  A    |       |
 | PEAR   |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | ORANGE |  A    |       |
 | ORANGE |       | X     |
 | ORANGE |       | Y     |
 | ORANGE |       | Z     |
  • APPLE被排除,因为在Value1 = A之后的行上, 值2!= X
  • FIG被排除,因为Value2 = X出现在Value1 = A之前的行上, 而不是之后的行。
  • 排除了GRAPE,因为没有行Value1 = A.
  • PEACH被排除,因为至少有一行其中Value1!= A.
  • MANGO被排除,因为没有行是Value1 = A,因为 没有值,其中Value2 = X。

对我来说似乎有点棘手的部分是在行组级别执行多次检查,但仍返回匹配组的所有行。

提前感谢您提供的提示和建议。如果您需要我澄清这个问题,请告诉我。该数据库是z / OS上的DB2 V10。

1 个答案:

答案 0 :(得分:0)

除了需要订单栏(id或其他)的FIG(在您的示例中)之外,查询不会解决您的问题:

select * from fruits 
where fruit not in (select fruit from fruits where value1 is not null and value1 <> '' and value1 <> 'A')
and exists (select fruit from fruits f2 where f2.fruit = fruits.fruit and value2 = 'X')