这样的SQL语句如何写呢

fstao 2006-04-02 12:12:27
sql2000数据库:
表t1显示:
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 10101 人民币 期初余额 借 300
3 102 银行 期初余额 借 200
4 201 应付票据 期初余额 贷 100

5 101 现金 本期合计 80 30 借
6 10101 人民币 本期合计 40 50 借
7 123 原材料 本期合计 70 50 借
8 203 应付帐款 本期合计 90 贷
9 405 生产成本 本期合计 80 50 贷
10 501 销售成品 本期合计 90 90 贷

11 101 现金 本年累计 180 30 借
12 10101 人民币 本年累计 40 50 借
13 123 原材料 本年累计 70 50 借
14 201 应付票据 本年累计 410 510 贷
14 203 应付帐款 本年累计 90 贷
15 405 生产成本 本年累计 80 50 贷
16 501 销售成品 本年累计 90 90 贷

我想实现以下的数据:
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 101 现金 本期合计 80 30 借 150
3 101 现金 本年累计 180 30 借 150

4 10101 人民币 期初余额 借 300
5 10101 人民币 本期合计 40 50 借 290
6 10101 人民币 本年累计 430 140 借 290

7 102 银行 期初余额 借 200
8 102 银行 本期合计 借
9 102 银行 本期累计 330 130 借 200

10 123 原材料 期初余额 平
11 123 原材料 本期合计 70 50 借 20
12 123 原材料 本年累计 70 50 借 20

13 201 应付票据 期初余额 贷 100
14 201 应付票据 本期合计 贷 100
15 201 应付票据 本年累计 410 510 贷 100

16 203 应付帐款 期初余额 平
17 203 应付帐款 本期合计 90 贷 90
18 203 应付帐款 本年累计 90 贷 90

19 405 生产成本 期初余额 平
20 405 生产成本 本期合计 80 50 贷 -30
21 405 生产成本 本年累计 80 50 贷 -30

22 501 销售成品 期初余额 平
23 501 销售成品 本期合计 90 90 平
24 501 销售成品 本年累计 90 90 平

说明:
(1)、如果f6='借'时,则f3='本期合计'的f7=期初余额的f7+f4-f5,如id=2的f7=100+80-30=150;
(2)、如果f6='借'时,则f3='本年累计'的f7=f4-f5,如id=3的f7=180-30=150;
(3)、在表的f1='123',只有'本期合计'和'本年累计',那么实现时,要把'期初余额'加上去,如实现的数据id=10,由于没有期初数据或为0,所以f6='平';
(4)、如果f6='贷'时,则f3='本期合计'的f7=期初余额的f7-f4+f5,如id=2的f7=100+80-30=150;如id=17、id=20、id=23;
(5)、如果f6='贷'时,则f3='本年累计'的f7=f5-f4,如id=15的f7=510-410=100;
(6)、只要是f7=''或者f7=null时,则f6='平'

请问用sql语句来实现,不要用游标实现,大家可以把我的问题copy到记事本上去,可能要清晰一点
...全文
359 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxdoujg 2006-04-03
  • 打赏
  • 举报
回复
学习!
fstao 2006-04-03
  • 打赏
  • 举报
回复
to libin_ftsafe(子陌红尘) :你真好牛啊
子陌红尘 2006-04-03
  • 打赏
  • 举报
回复
--输出结果
/*
f1 f2 f3 f4 f5 f6 f7
---------- ---------- ---------- ----------- ----------- ---- -----------
101 现金 期初余额 NULL NULL 借 100
101 现金 本期合计 80 30 借 150
101 现金 本年累计 180 30 借 150
10101 人民币 期初余额 NULL NULL 借 300
10101 人民币 本期合计 40 50 借 290
10101 人民币 本年累计 430 140 借 290
102 银行 期初余额 NULL NULL 借 200
102 银行 本期合计 NULL NULL 借 200
102 银行 本年累计 330 130 借 200
123 原材料 期初余额 NULL NULL 平 NULL
123 原材料 本期合计 70 50 借 20
123 原材料 本年累计 70 50 借 20
201 应付票据 期初余额 NULL NULL 贷 100
201 应付票据 本期合计 NULL NULL 贷 100
201 应付票据 本年累计 410 510 贷 100
203 应付帐款 期初余额 NULL NULL 平 NULL
203 应付帐款 本期合计 NULL 90 贷 90
203 应付帐款 本年累计 NULL 90 贷 90
405 生产成本 期初余额 NULL NULL 平 NULL
405 生产成本 本期合计 80 50 贷 -30
405 生产成本 本年累计 80 50 贷 -30
501 销售成品 期初余额 NULL NULL 平 NULL
501 销售成品 本期合计 90 90 平 NULL
501 销售成品 本年累计 90 90 平 NULL
*/
子陌红尘 2006-04-03
  • 打赏
  • 举报
回复
declare @t table(id int,f1 varchar(10),f2 varchar(10),f3 varchar(10),f4 int,f5 int,f6 varchar(4),f7 int)
insert into @t select 1 ,rtrim('101 '),rtrim('现金 '),'期初余额',null,null,'借',100
insert into @t select 2 ,rtrim('10101'),rtrim('人民币 '),'期初余额',null,null,'借',300
insert into @t select 3 ,rtrim('102 '),rtrim('银行 '),'期初余额',null,null,'借',200
insert into @t select 4 ,rtrim('201 '),rtrim('应付票据'),'期初余额',null,null,'贷',100
insert into @t select 5 ,rtrim('101 '),rtrim('现金 '),'本期合计', 80, 30,'借',null
insert into @t select 6 ,rtrim('10101'),rtrim('人民币 '),'本期合计', 40, 50,'借',null
insert into @t select 7 ,rtrim('123 '),rtrim('原材料 '),'本期合计', 70, 50,'借',null
insert into @t select 8 ,rtrim('203 '),rtrim('应付帐款'),'本期合计',null, 90,'贷',null
insert into @t select 9 ,rtrim('405 '),rtrim('生产成本'),'本期合计', 80, 50,'贷',null
insert into @t select 10,rtrim('501 '),rtrim('销售成品'),'本期合计', 90, 90,'贷',null
insert into @t select 11,rtrim('101 '),rtrim('现金 '),'本年累计', 180, 30,'借',null
insert into @t select 12,rtrim('10101'),rtrim('人民币 '),'本年累计', 430, 140,'借',null
insert into @t select 13,rtrim('102 '),rtrim('银行 '),'本年累计', 330, 130,'借',null
insert into @t select 13,rtrim('123 '),rtrim('原材料 '),'本年累计', 70, 50,'借',null
insert into @t select 14,rtrim('201 '),rtrim('应付票据'),'本年累计', 410, 510,'贷',null
insert into @t select 14,rtrim('203 '),rtrim('应付帐款'),'本年累计',null, 90,'贷',null
insert into @t select 15,rtrim('405 '),rtrim('生产成本'),'本年累计', 80, 50,'贷',null
insert into @t select 16,rtrim('501 '),rtrim('销售成品'),'本年累计', 90, 90,'贷',null



select
a.f1,a.f2,'期初余额' as f3,b.f4,b.f5,isnull(b.f6,'平') f6,b.f7
from
(select distinct f1,f2 from @t) a
left join
@t b
on
a.f1=b.f1 and b.f3='期初余额'
union all
select
a.f1,a.f2,'本期合计' as f3,b.f4,b.f5,
(case
when isnull(b.f4,0)-isnull(b.f5,0)=0 and not exists(select 1 from @t where f1=a.f1 and f3='期初余额')
then '平'
when b.f4 is null and b.f5 is null
then isnull((select f6 from @t where f1=a.f1 and f3='期初余额'),'平')
else
b.f6
end) as f6,
(case
when isnull(b.f4,0)-isnull(b.f5,0)=0 and not exists(select 1 from @t where f1=a.f1 and f3='期初余额')
then null
when b.f4 is null and b.f5 is null
then (select f7 from @t where f1=a.f1 and f3='期初余额')
else
case b.f6
when '借' then isnull(b.f4,0)-isnull(b.f5,0)+isnull((select (case f6 when '借' then f7 else -f7 end) from @t where f1=a.f1 and f3='期初余额'),0)
when '贷' then isnull(b.f5,0)-isnull(b.f4,0)+isnull((select (case f6 when '借' then -f7 else f7 end) from @t where f1=a.f1 and f3='期初余额'),0)
end
end) as f7
from
(select distinct f1,f2 from @t) a
left join
@t b
on
a.f1=b.f1 and b.f3='本期合计'
union all
select
f1,f2,f3,f4,f5,
(case
when (select isnull(f4,0)-isnull(f5,0) from @t where f1=a.f1 and f3='本期合计')=0
and
not exists(select 1 from @t where f1=a.f1 and f3='期初余额')
then '平'
when not exists(select 1 from @t where f1=a.f1 and f3='本期合计')
then isnull((select f6 from @t where f1=a.f1 and f3='期初余额'),'平')
else
(select f6 from @t where f1=a.f1 and f3='本期合计')
end) as f6,
(case
when (select isnull(f4,0)-isnull(f5,0) from @t where f1=a.f1 and f3='本期合计')=0
and
not exists(select 1 from @t where f1=a.f1 and f3='期初余额')
then null
when not exists(select 1 from @t where f1=a.f1 and f3='本期合计')
then (select f7 from @t where f1=a.f1 and f3='期初余额')
else
case (select f6 from @t where f1=a.f1 and f3='本期合计')
when '借' then (select isnull(f4,0)-isnull(f5,0) from @t where f1=a.f1 and f3='本期合计')+isnull((select (case f6 when '借' then f7 else -f7 end) from @t where f1=a.f1 and f3='期初余额'),0)
when '贷' then (select isnull(f5,0)-isnull(f4,0) from @t where f1=a.f1 and f3='本期合计')+isnull((select (case f6 when '借' then -f7 else f7 end) from @t where f1=a.f1 and f3='期初余额'),0)
end
end) as f7
from
@t a
where
a.f3='本年累计'
order by
a.f1,a.f2,f3 desc
fstao 2006-04-03
  • 打赏
  • 举报
回复
看来原始数据没有问题吧
fstao 2006-04-03
  • 打赏
  • 举报
回复
to zjdyzwx(十一月猪) :不好意思原始数据写漏了。我再改过

表t1显示:
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 10101 人民币 期初余额 借 300
3 102 银行 期初余额 借 200
4 201 应付票据 期初余额 贷 100

5 101 现金 本期合计 80 30 借
6 10101 人民币 本期合计 40 50 借
7 123 原材料 本期合计 70 50 借
8 203 应付帐款 本期合计 90 贷
9 405 生产成本 本期合计 80 50 贷
10 501 销售成品 本期合计 90 90 贷

11 101 现金 本年累计 180 30 借
12 10101 人民币 本年累计 430 140 借
13 102 银行 本年累计 330 130 借
13 123 原材料 本年累计 70 50 借
14 201 应付票据 本年累计 410 510 贷
14 203 应付帐款 本年累计 90 贷
15 405 生产成本 本年累计 80 50 贷
16 501 销售成品 本年累计 90 90 贷

我想实现以下的数据:
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 101 现金 本期合计 80 30 借 150
3 101 现金 本年累计 180 30 借 150

4 10101 人民币 期初余额 借 300
5 10101 人民币 本期合计 40 50 借 290
6 10101 人民币 本年累计 430 140 借 290

7 102 银行 期初余额 借 200
8 102 银行 本期合计 借 200
9 102 银行 本期累计 330 130 借 200

10 123 原材料 期初余额 平
11 123 原材料 本期合计 70 50 借 20
12 123 原材料 本年累计 70 50 借 20

13 201 应付票据 期初余额 贷 100
14 201 应付票据 本期合计 贷 100
15 201 应付票据 本年累计 410 510 贷 100

16 203 应付帐款 期初余额 平
17 203 应付帐款 本期合计 90 贷 90
18 203 应付帐款 本年累计 90 贷 90

19 405 生产成本 期初余额 平
20 405 生产成本 本期合计 80 50 贷 -30
21 405 生产成本 本年累计 80 50 贷 -30

22 501 销售成品 期初余额 平
23 501 销售成品 本期合计 90 90 平
24 501 销售成品 本年累计 90 90 平

说明:
(1)、如果f6='借'时,则f3='本期合计'的f7=期初余额的f7+f4-f5,如id=2的f7=100+80-30=150;
(2)、如果f6='借'时,则f3='本年累计'的f7=f4-f5,如id=3的f7=180-30=150;
(3)、在表的f1='123',只有'本期合计'和'本年累计',那么实现时,要把'期初余额'加上去,如实现的数据id=10,由于没有期初数据或为0,所以

f6='平';
(4)、如果f6='贷'时,则f3='本期合计'的f7=期初余额的f7-f4+f5,如id=2的f7=100+80-30=150;如id=17、id=20、id=23;
(5)、如果f6='贷'时,则f3='本年累计'的f7=f5-f4,如id=15的f7=510-410=100;
(6)、只要是f7=''或者f7=null时,则f6='平'

请问用sql语句来实现,不要用游标实现,大家可以把我的问题copy到记事本上去,可能要清晰一点
prcgolf 2006-04-03
  • 打赏
  • 举报
回复
up
十一月猪 2006-04-03
  • 打赏
  • 举报
回复
9 102 银行 本期累计 330 130 借 200
-------------------------------------------------------
是怎么得到的
新鲜鱼排 2006-04-03
  • 打赏
  • 举报
回复
mark
sunsuny 2006-04-03
  • 打赏
  • 举报
回复

mark
fstao 2006-04-02
  • 打赏
  • 举报
回复
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 10101 人民币 期初余额 借 300
3 102 银行 期初余额 借 200
4 201 应付票据 期初余额 贷 100

5 101 现金 本期合计 80 30 借
6 10101 人民币 本期合计 40 50 借
7 123 原材料 本期合计 70 50 借
8 203 应付帐款 本期合计 90 贷
9 405 生产成本 本期合计 80 50 贷
10 501 销售成品 本期合计 90 90 贷

11 101 现金 本年累计 180 30 借
12 10101 人民币 本年累计 430 140 借
13 123 原材料 本年累计 70 50 借
14 201 应付票据 本年累计 410 510 贷
14 203 应付帐款 本年累计 90 贷
15 405 生产成本 本年累计 80 50 贷
16 501 销售成品 本年累计 90 90 贷

我想实现以下的数据:
id f1 f2 f3 f4 f5 f6 f7
1 101 现金 期初余额 借 100
2 101 现金 本期合计 80 30 借 150
3 101 现金 本年累计 180 30 借 150

4 10101 人民币 期初余额 借 300
5 10101 人民币 本期合计 40 50 借 290
6 10101 人民币 本年累计 430 140 借 290

7 102 银行 期初余额 借 200
8 102 银行 本期合计 借 200
9 102 银行 本期累计 330 130 借 200

10 123 原材料 期初余额 平
11 123 原材料 本期合计 70 50 借 20
12 123 原材料 本年累计 70 50 借 20

13 201 应付票据 期初余额 贷 100
14 201 应付票据 本期合计 贷 100
15 201 应付票据 本年累计 410 510 贷 100

16 203 应付帐款 期初余额 平
17 203 应付帐款 本期合计 90 贷 90
18 203 应付帐款 本年累计 90 贷 90

19 405 生产成本 期初余额 平
20 405 生产成本 本期合计 80 50 贷 -30
21 405 生产成本 本年累计 80 50 贷 -30

22 501 销售成品 期初余额 平
23 501 销售成品 本期合计 90 90 平
24 501 销售成品 本年累计 90 90 平

说明:
(1)、如果f6='借'时,则f3='本期合计'的f7=期初余额的f7+f4-f5,如id=2的f7=100+80-30=150;
(2)、如果f6='借'时,则f3='本年累计'的f7=f4-f5,如id=3的f7=180-30=150;
(3)、在表的f1='123',只有'本期合计'和'本年累计',那么实现时,要把'期初余额'加上去,如实现的数据id=10,由于没有期初数据或为0,所以

f6='平';
(4)、如果f6='贷'时,则f3='本期合计'的f7=期初余额的f7-f4+f5,如id=2的f7=100+80-30=150;如id=17、id=20、id=23;
(5)、如果f6='贷'时,则f3='本年累计'的f7=f5-f4,如id=15的f7=510-410=100;
(6)、只要是f7=''或者f7=null时,则f6='平'

请问用sql语句来实现,不要用游标实现,大家可以把我的问题copy到记事本上去,可能要清晰一点
fstao 2006-04-02
  • 打赏
  • 举报
回复
to ll_e_mail()和libin_ftsafe(子陌红尘) ,不好意思,写错了基础表和实现表,重新写过。
TombFigure 2006-04-02
  • 打赏
  • 举报
回复
这个问题是挺复杂的
关注先
子陌红尘 2006-04-02
  • 打赏
  • 举报
回复
这一行中的f4和f5怎么计算出来的?
--------------------------------------------------------------------------------------------------------------------------------------
6 10101 人民币 本年累计 430 140 借 290
ll_e_mail 2006-04-02
  • 打赏
  • 举报
回复
基础表与实现表的记录数不同是吧

22,294

社区成员

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

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