解答论坛上面的一个数据库问题

    在http://oracle.group.iteye.com/group/topic/19806上看到有人提出了一个数据库的问题,在上面看到了解答过程,有一个解答是用了表的关联(没有验证那个解答是否正确),其实不用表的关联,也可以达到效果。只用一个查询,再从结果集中获取数据,这样效率也会更高,因为毕竟只是对查询结果的计算,代价基本可以忽略。现把我的解答,及其分析过程写一下。

    题目:一个talbe  Material 它的列位有name,type, state,  typeA,B,C 它们都有三种state New Used Drop 分别用 100200300代表,material name type 确定唯一。比如 数据库中有以下数据

nametypestate
M1A100
M1B200
M1C300
M2A200
M2B100
M3C100
M3A200
 

 

    现在要查询出来的结果是 一个Name 就有且仅有一条记录 该记录包括它的所有type 状态  如:  

nameAStateBStateCState
M1NewUsedDrop
M2UsedNew 
M3Used New
 

 (1)这个需求里面有2case when 的要求就是case name (case type when a ),但是数据库的case when 不支持嵌套的case when方式。这样就可以按照2步走,先用一个case when获取一个结果集,然后再在结果集中计算。

nameabc
M1100200300
M22001000
M32000100

 

 

能获取这个结果集,那么离上面的结果就不远了。

(2) 获取(1)中的结果集,首先我们获取一个简单点的结果集

nameabc
M1100  
M1 200 
M1  300
M2200  
M2 100 
M3  100
M3200  

 

  获取这个结果集,就是说的第一个case when了,sql如下:

select name, 
case when type='A' then state else '' end as a,
case when type='B'then state else '' end as b, 
case when type='C' then state else '' end as c from material 

 

 

 问题是怎么样得到(1)中的结果集呢?我们应该注意到一个条件,material name type 是确定唯一,这就好办了,用sum就可以了.

select name, 
sum(case when type='A' then state else '' end) as a, 
sum(case when type='B'then state else '' end) as b, 
sum(case when type='C' then state else '' end) as c from material group by name 

 

这样我们就可以得到(1)中的结果集了。

 

(3)得到(1)中的结果,我们就完成了第一个case when ,我们再进行第二个case when 就可以得到所要的结果了。这个看看数据库文档里面的case when就可以明白下面这条sql了,就不多说了。

select t.name,
(case when t.a=100 then 'New' when t.a=200 then 'Used' when t.a=300 then 'Drop' else ''end) as AState, 
(case when t.b=100 then 'New' when t.b=200 then 'Used' when t.b=300 then 'Drop' else ''end) as BState, 
(case when t.c=100 then 'New' when t.c=200 then 'Used' when t.c=300 then 'Drop' else ''end) as CState 
from 
( select name, 
sum(case when type='A' then state else '' end) as a, 
sum(case when type='B'then state else '' end) as b,
 sum(case when type='C' then state else '' end) as c from material group by name ) t 

 

 

 这样我们就可以用一条sql,并且不用到任何自身关联,就可以得到结果集了。顺便说下,javaeye上面的文档编辑器,真的不好用。插入进去的都变形了,过会再调下。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值