Sql Oracle 8i查询帮助

Sql Oracle 8i查询帮助,sql,oracle,Sql,Oracle,我有一张像这样的桌子: ID | STATUS | TYPE ---------------------------------------- x123 | A | High School x122 | I | High School x124 | F | High School x125 | A | College

我有一张像这样的桌子:

     ID    |     STATUS    |     TYPE
----------------------------------------
x123       |      A        | High School
x122       |      I        | High School
x124       |      F        | High School
x125       |      A        | College
x126       |      I        | College
x127       |      F        | College
x128       |      F        | College
有人能帮我找到一个oracle 8i的查询,它会像这样显示这个表吗

Type             |    Count A    |    Count I    |  Count F
------------------------------------------------------------
High School      |     1         |     1         |  1
College          |     1         |     1         |  2
谢谢

这里有一种方法:

select t.type                                          as "Type"
     , sum(case when t.status = 'A' then 1 else 0 end) as "Count A"
     , sum(case when t.status = 'I' then 1 else 0 end) as "Count I"
     , sum(case when t.status = 'F' then 1 else 0 end) as "Count F"
  from my_table t
 group by t.type
 order by t.type desc
如果您想要返回特定的列,并且对满足更复杂的条件集的行进行“计数”,则此操作有效

[编辑]

(添加DESC关键字以获得按OP所示顺序排列的结果集,+1 Rob van Wijk的良好捕获!)

(Andomar做了一个很好的观察,结果集中的列越来越多,使用这种方法,语句变得不合适。如果唯一的“测试”是对单个列的相等性比较,那么还有其他方法可以很好地获得相同的结果集。)

Oracle 8i确实支持大小写表达式,不是吗?如果我没记错的话,甲骨文8没有。我们可以去“老派”用解码功能做同样的事情:

select t.type                        as "Type"
     , sum(decode(t.status,'A',1,0)) as "Count A"
     , sum(decode(t.status,'I',1,0)) as "Count I"
     , sum(decode(t.status,'F',1,0)) as "Count F"
  from my_table t
 group by t.type
 order by t.type DESC
[/编辑]

有时,我们需要检查多个类型条件,并在多个计数中包含一行。我们可以得到一个总数

select t.type                                             as "Type"
     , sum(case when t.status in ('A') then 1 else 0 end) as "Count A"
     , sum(case when t.status in ('I') then 1 else 0 end) as "Count I"
     , sum(case when t.status in ('F') then 1 else 0 end) as "Count F"
     , sum(case when t.status in ('A','I') then 1 else 0 end) as "#AI"
     , sum(decode(sign(t.foo-t.bar),1,1,0))               as "#foo>bar"
     , sum(decode(sign(10.0-t.foo),1,1,0))                as "#foo<10"
  from my_table t
 group by t.type
 order by t.type desc
选择t.type作为“type”
,求和(当t.status在('A')中时,则为1,否则为0结束)为“计数A”
,求和(当t.status在('I')中时,则为1,否则为0结束)为“计数I”
,求和(当t.status在('F')中时,则为1,否则为0结束)为“计数F”
,求和(当t.status在('A','I')中时,则为1,否则为0结束)为“#AI”
,和(解码(符号(t.foo-t.bar),1,1,0))为“#foo>bar”
,和(解码(符号(10.0-t.foo),1,1,0))为“#foo这里有一种方法:

select t.type                                          as "Type"
     , sum(case when t.status = 'A' then 1 else 0 end) as "Count A"
     , sum(case when t.status = 'I' then 1 else 0 end) as "Count I"
     , sum(case when t.status = 'F' then 1 else 0 end) as "Count F"
  from my_table t
 group by t.type
 order by t.type desc
如果您想要返回特定的列,并且对满足更复杂的条件集的行进行“计数”,则此操作有效

[编辑]

(添加DESC关键字以获得按OP所示顺序排列的结果集,+1 Rob van Wijk的良好捕获!)

(Andomar做了一个很好的观察,结果集中的列越来越多,使用这种方法,语句变得不合适。如果唯一的“测试”是对单个列的相等性比较,那么还有其他方法可以很好地获得相同的结果集。)

Oracle 8i确实支持大小写表达式,不是吗?如果我没记错的话,Oracle 8不支持。我们可以使用“老派”对解码函数执行同样的操作:

select t.type                        as "Type"
     , sum(decode(t.status,'A',1,0)) as "Count A"
     , sum(decode(t.status,'I',1,0)) as "Count I"
     , sum(decode(t.status,'F',1,0)) as "Count F"
  from my_table t
 group by t.type
 order by t.type DESC
[/编辑]

有时,我们需要检查多个类型条件,并在多个计数中包含一行。我们可以得到一个总数

select t.type                                             as "Type"
     , sum(case when t.status in ('A') then 1 else 0 end) as "Count A"
     , sum(case when t.status in ('I') then 1 else 0 end) as "Count I"
     , sum(case when t.status in ('F') then 1 else 0 end) as "Count F"
     , sum(case when t.status in ('A','I') then 1 else 0 end) as "#AI"
     , sum(decode(sign(t.foo-t.bar),1,1,0))               as "#foo>bar"
     , sum(decode(sign(10.0-t.foo),1,1,0))                as "#foo<10"
  from my_table t
 group by t.type
 order by t.type desc
选择t.type作为“type”
,求和(当t.status在('A')中时,则为1,否则为0结束)为“计数A”
,求和(当t.status在('I')中时,则为1,否则为0结束)为“计数I”
,求和(当t.status在('F')中时,则为1,否则为0结束)为“计数F”
,求和(当t.status在('A','I')中时,则为1,否则为0结束)为“#AI”
,和(解码(符号(t.foo-t.bar),1,1,0))为“#foo>bar”

,求和(解码(符号(10.0-t.foo),1,1,0))为“#foo+1,但如果有100多个不同的状态,则会出现故障:)+1个好的老式pivot解决方案。只有顺序应该是降序的:-)@Andomar:这与其说是“分解”的问题,不如说是结果集中添加了越来越多的列,实际上是语句变得越来越不合适的问题。事实上,我在一个大型数据集市应用程序中使用了这种方法,其中用户希望“计算”各种复杂的critera组合(计算两个日期之间持续时间小于10天且状态未完成的行,计算持续时间小于3天且状态为(1,3,7)的行),等等)+1尽管如果有100多个不同的状态,这将崩溃:)+1个好的老式pivot解决方案。只有顺序应该是降序的:-)@Andomar:这与其说是“分解”的问题,不如说是结果集中添加了越来越多的列,实际上是语句变得越来越不合适的问题。事实上,我在一个大型数据集市应用程序中使用了这种方法,其中用户希望“计算”各种复杂的critera组合(计算两个日期之间持续时间小于10天且状态未完成的行,计算持续时间小于3天且状态为(1,3,7)的行),等等)