有一个表A 如下
票据号 姓名 买卖 金额
1 张三 买 100
1 李四 卖 100
2 小王 买 500
2 小马 卖 500现在通过一个sql(不用视图)实现如下输出票据号 买方姓名 卖方姓名 金额
1 张三 李四 100
2 小王 小马 500
oracle 中有decode函数是否可以实现呢?
票据号 姓名 买卖 金额
1 张三 买 100
1 李四 卖 100
2 小王 买 500
2 小马 卖 500现在通过一个sql(不用视图)实现如下输出票据号 买方姓名 卖方姓名 金额
1 张三 李四 100
2 小王 小马 500
oracle 中有decode函数是否可以实现呢?
from
(select 票据号,姓名,金额 from a where 买卖 = '买')ta
inner join
(select 票据号,姓名,金额 from a where 买卖 = '卖')tb
on a.票据号 = b.票据号
from
(select 票据号,姓名,金额 from a where 买卖 = '买')ta ,
(select 票据号,姓名,金额 from a where 买卖 = '卖')tb
where ta.票据号 = tb.票据号 and ta.金额 = tb.金额
票据号,
max(decode(买卖,'买',姓名)) as 买方姓名,
max(decode(买卖,'卖',姓名)) as 卖方姓名,
金额
from
表A
group by
票据号,金额select
a.票据号,
a.姓名 as 买方姓名,
b.姓名 as 卖方姓名,
a.金额
from
表A a,
表A b
where
a.票据号=b.票据号
and
a.金额=b.金额
and
a.买卖='买'
and
b.买卖='卖'
libin_ftsafe(子陌红尘:当libin告别ftsafe)的第一个sql文就注意到了避免重复票据号的问题
比如有三个或者以上的相同票据号
max( t.买方姓名) as 买方姓名,
max( t.卖方姓名) as 卖方姓名,
t.金额
from
(select a1.票据号,
decode(a1.买卖,'买'a.姓名,null) as 买方姓名,
decode(a1.买卖,'卖'a.姓名,null) as 卖方姓名,
a1.金额
from 表 a1,表 a2
on a1.票据号 = a2.票据) t
group by t.票据号
order by t.票据号
作票号的等值并且姓名的不等值连接,成这样
1 张三 买 100 1 李四 卖 100
1 李四 卖 100 1 张三 买 100
2 小王 买 500 2 小马 卖 500
2 小马 卖 500 2 小王 买 500
然后根据买卖关系decode成:
1 张三 买 100 1 李四 卖 100
1 张三 买 100 1 李四 卖 100
2 小王 买 500 2 小马 卖 500
2 小王 买 500 2 小马 卖 500
然后再distinct一下何必说很难呢!
呵呵