行拆分处理数据

hj20762003 2013-12-19 10:05:34


以下是环境脚本:

create table a (bh varchar(2),mc varchar(10))
insert into a values ('01','A账户')
insert into a values ('02','B账户')

create table b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into b values ('21','01',null,100.00)
insert into b values ('23','02','01',200.00)
...全文
209 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2013-12-20
  • 打赏
  • 举报
回复


SELECT t1.*,t2.mc AS shmc,t3.mc AS fmc 
	FROM (
		SELECT *,0 AS se FROM b UNION ALL
		SELECT lx,fkh,shkh,0,je FROM b WHERE shkh IS NOT NULL AND fkh IS NOT null
	) t1 
	JOIN a t2 ON t1.shkh=t2.bh 
	JOIN a t3 ON t1.fkh=t3.bh
		
/*
lx   shkh fkh  je                                      se                                      shmc       fmc
---- ---- ---- --------------------------------------- --------------------------------------- ---------- ----------
23   02   01   200.00                                  0.00                                    B账户        A账户
23   01   02   0.00                                    200.00                                  A账户        B账户
*/

LongRui888 2013-12-20
  • 打赏
  • 举报
回复
把上面的代码改了一下,应该适合2000运行:
create table #a (bh varchar(2),mc varchar(10))
insert into #a values ('01','A账户')
insert into #a values ('02','B账户')

create table #b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into #b values ('21','01',null,100.00)
insert into #b values ('23','02','01',200.00)



select 类型,账号名称,对方账号名称,convert(varchar(50),收入金额)收入金额,convert(varchar(50),支出金额)支出金额 
from 
(
	select lx '类型',
	case when shkh='02' then (select mc from #a where bh='02') end '账号名称',
	case when fkh='01' then (select mc from #a where bh='01') end '对方账号名称',
	case when shkh='02' then je end '收入金额',
	case when fkh='01' then '' end '支出金额'
	from #b 
	where lx=23
)cte
union all
select 类型,对方账号名称,账号名称,convert(varchar(50),支出金额),convert(varchar(50),收入金额) 
from 
(
	select lx '类型',
	case when shkh='02' then (select mc from #a where bh='02') end '账号名称',
	case when fkh='01' then (select mc from #a where bh='01') end '对方账号名称',
	case when shkh='02' then je end '收入金额',
	case when fkh='01' then '' end '支出金额'
	from #b 
	where lx=23
)cte
/*
类型	账号名称	对方账号名称	收入金额	支出金额
23	B账户	A账户	200.00	
23	A账户	B账户		200.00
*/
hj20762003 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 hj20762003 的回复:
[quote=引用 1 楼 u012173239 的回复:] [quote=引用 楼主 hj20762003 的回复:] 以下是环境脚本:
create table a (bh varchar(2),mc varchar(10))
insert into a values ('01','A账户')
insert into a values ('02','B账户')

create table b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into b values ('21','01',null,100.00)
insert into b values ('23','02','01',200.00)
你想要的结果有些看不懂,能不能说的清楚点?? 23的账号名称和对方账号名称是怎么来的? [/quote]表1是基础信息表,存放是账号和名称,表2是交易明细,存的是编码和金额,如从A账户转到B账户,我想显示成两条记录[/quote]
引用 3 楼 hj20762003 的回复:
[quote=引用 1 楼 u012173239 的回复:] [quote=引用 楼主 hj20762003 的回复:] 以下是环境脚本:
create table a (bh varchar(2),mc varchar(10))
insert into a values ('01','A账户')
insert into a values ('02','B账户')

create table b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into b values ('21','01',null,100.00)
insert into b values ('23','02','01',200.00)
你想要的结果有些看不懂,能不能说的清楚点?? 23的账号名称和对方账号名称是怎么来的? [/quote]表1是基础信息表,存放是账号和名称,表2是交易明细,存的是编码和金额,如从A账户转到B账户,我想显示成两条记录[/quote]另外我数据库是sql server 2000
hj20762003 2013-12-20
  • 打赏
  • 举报
回复
引用 1 楼 u012173239 的回复:
[quote=引用 楼主 hj20762003 的回复:] 以下是环境脚本:
create table a (bh varchar(2),mc varchar(10))
insert into a values ('01','A账户')
insert into a values ('02','B账户')

create table b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into b values ('21','01',null,100.00)
insert into b values ('23','02','01',200.00)
你想要的结果有些看不懂,能不能说的清楚点?? 23的账号名称和对方账号名称是怎么来的? [/quote]表1是基础信息表,存放是账号和名称,表2是交易明细,存的是编码和金额,如从A账户转到B账户,我想显示成两条记录
KeepSayingNo 2013-12-20
  • 打赏
  • 举报
回复
我们要分析楼主的真实需求,楼主想要的是收款户和付款户都不为空的这些记录转换为最终的结果,而类型23只是刚好满足了这个条件,所以楼主以23举例说明。

select c.lx,a.mc as account,d.mc as to_account,c.get_money,c.pay_money from
(
select lx,shkh as account,fkh as to_account,je as get_money,null as pay_money
from (
select * from b where b.shkh is not null and b.fkh is not null) t
union all
select lx,fkh as account,shkh as to_account,null as get_money,je as pay_money
from (select * from b where b.shkh is not null and b.fkh is not null) t
) c left join a on c.account=a.bh
left join a d on c.to_account=d.bh


Landa_Jimmy 2013-12-19
  • 打赏
  • 举报
回复
create table #a (bh varchar(2),mc varchar(10))
insert into #a values ('01','A账户')
insert into #a values ('02','B账户')

create table #b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into #b values ('21','01',null,100.00)
insert into #b values ('23','02','01',200.00)

select * from #b

with cte as
(
	select lx '类型',
	case when shkh='02' then (select mc from #a where bh='02') end '账号名称',
	case when fkh='01' then (select mc from #a where bh='01') end '对方账号名称',
	case when shkh='02' then je end '收入金额',
	case when fkh='01' then '' end '支出金额'
	from #b 
	where lx=23
)
select 类型,账号名称,对方账号名称,convert(varchar(50),收入金额)收入金额,convert(varchar(50),支出金额)支出金额 from cte
union all
select 类型,对方账号名称,账号名称,convert(varchar(50),支出金额),convert(varchar(50),收入金额) from cte

类型   账号名称       对方账号名称     收入金额                                               支出金额
---- ---------- ---------- -------------------------------------------------- --------------------------------------------------
23   B账户        A账户        200.00                                             
23   A账户        B账户                                                           200.00

(2 row(s) affected)
Landa_Jimmy 2013-12-19
  • 打赏
  • 举报
回复
引用 楼主 hj20762003 的回复:
以下是环境脚本:
create table a (bh varchar(2),mc varchar(10))
insert into a values ('01','A账户')
insert into a values ('02','B账户')

create table b(lx varchar(2),shkh varchar(2),fkh varchar(2),je decimal(13,2))
insert into b values ('21','01',null,100.00)
insert into b values ('23','02','01',200.00)
你想要的结果有些看不懂,能不能说的清楚点?? 23的账号名称和对方账号名称是怎么来的?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧