如何获得这样的多级科目汇总表?

cnforecast 2009-02-19 11:25:13
如何获得这样的多级科目汇总表

科目表 iteminfo

itembm itemmc
1001 现金
1002 银行存款
1211 原材料
1211001 精面粉
1211001001 双福精面粉

凭证表 pzb
itembm jfje dfje rq
1001 10 2009-02-19
1002 10 2009-02-19
1001 20 2009-02-19
1211001001 20 2009-02-19

我现在用一条select能获得一级汇总表:
select left(itembm,4) as itembm,sum(jfje) as jfje,sum(dfje) as dfje from pzb where group by left(itembm,4) order by left(itembm,4)

得到结果:

itembm itemmc jfje dfje
1001 现金 30
1002 银行存款 10
1211 原材料 20

查询二级的:
select left(itembm,7) as itembm,sum(jfje) as jfje,sum(dfje) as dfje from pzb where group by left(itembm,7) order by left(itembm,7)

得到结果:

itembm itemmc jfje dfje
1001 现金 30
1002 银行存款 10
1211001 精面粉 20


如何能获得多级的科目汇总表。如下表,(用临时表我做出能显示两级,但太繁琐,再做多级就乱套了)
itembm itemmc jfje dfje
1001 现金 30
1002 银行存款 10
1211 原材料 20
1211001 精面粉 20
1211001001 双福精面粉 20
...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgxyz 2009-02-19
  • 打赏
  • 举报
回复
IF NOT OBJECT_ID('ITEMINFO') IS NULL DROP TABLE ITEMINFO
GO
CREATE TABLE ITEMINFO([ITEMBM] VARCHAR(20),[ITEMMC] NVARCHAR(5))
Insert iteminfo
SELECT '1001',N'现金' UNION ALL
SELECT '1002',N'银行存款' UNION ALL
SELECT '1211',N'原材料' UNION ALL
SELECT '1211001',N'精面粉' UNION ALL
SELECT '1211001001',N'双福精面粉'
Go



IF NOT OBJECT_ID('PZB') IS NULL DROP TABLE PZB
GO
CREATE TABLE PZB([ITEMBM] VARCHAR(50),[JFJE] INT,[DFJE] DATETIME)
Insert pzb
SELECT '1001',10,'2009-02-19' UNION ALL
SELECT '1002',10,'2009-02-19' UNION ALL
SELECT '1001',20,'2009-02-19' UNION ALL
SELECT '1211001001',20,'2009-02-19'
Go


SELECT A.ITEMBM,A.ITEMMC,JFJE=SUM(ISNULL(B.JFJE,0)) FROM ITEMINFO A
LEFT JOIN PZB B
ON B.ITEMBM LIKE A.ITEMBM+'%'
GROUP BY A.ITEMBM,A.ITEMMC
ORDER BY A.ITEMBM

/*ITEMBM ITEMMC JFJE
-------------------- ------ -----------
1001 现金 30
1002 银行存款 10
1211 原材料 20
1211001 精面粉 20
1211001001 双福精面粉 20

(所影响的行数为 5 行)
*/
dawugui 2009-02-19
  • 打赏
  • 举报
回复
create table iteminfo (itembm  varchar(20),      itemmc varchar(20))
insert into iteminfo values('1001' , '现金')
insert into iteminfo values('1002' , '银行存款')
insert into iteminfo values('1211' , '原材料')
insert into iteminfo values('1211001' , '精面粉')
insert into iteminfo values('1211001001', '双福精面粉')
create table pzb(itembm varchar(10), jfje int, dfje int, rq datetime)
insert into pzb values('1001' , 10 , 0 , '2009-02-19')
insert into pzb values('1002' , 0 , 10 , '2009-02-19')
insert into pzb values('1001' , 20 , 0 , '2009-02-19')
insert into pzb values('1211001001', 0 , 20 , '2009-02-19')

--方法1
select m.itembm , isnull(sum(n.jfje),0) jfje , isnull(sum(n.dfje),0) dfje
from iteminfo m left join pzb n
on n.itembm like m.itembm + '%'
group by m.itembm

--方法2
select m.itembm , isnull(sum(n.jfje),0) jfje , isnull(sum(n.dfje),0) dfje
from iteminfo m left join pzb n
on charindex(m.itembm , n.itembm) > 0
group by m.itembm


drop table iteminfo , pzb

/*
itembm jfje dfje
-------------------- ----------- -----------
1001 30 20
1002 0 10
1211 0 20
1211001 0 20
1211001001 0 20

(所影响的行数为 5 行)
*/
dawugui 2009-02-19
  • 打赏
  • 举报
回复
create table iteminfo (itembm  varchar(20),      itemmc varchar(20))
insert into iteminfo values('1001' , '现金')
insert into iteminfo values('1002' , '银行存款')
insert into iteminfo values('1211' , '原材料')
insert into iteminfo values('1211001' , '精面粉')
insert into iteminfo values('1211001001', '双福精面粉')
create table pzb(itembm varchar(10), jfje int, dfje int, rq datetime)
insert into pzb values('1001' , 10 , 0 , '2009-02-19')
insert into pzb values('1002' , 0 , 10 , '2009-02-19')
insert into pzb values('1001' , 20 , 0 , '2009-02-19')
insert into pzb values('1211001001', 0 , 20 , '2009-02-19')

select m.itembm , isnull(sum(n.jfje),0) jfje , isnull(sum(n.dfje),0) dfje
from iteminfo m left join pzb n
on charindex(m.itembm , n.itembm) > 0
group by m.itembm

drop table iteminfo , pzb

/*
itembm jfje dfje
-------------------- ----------- -----------
1001 30 20
1002 0 10
1211 0 20
1211001 0 20
1211001001 0 20

(所影响的行数为 5 行)
*/
dawugui 2009-02-19
  • 打赏
  • 举报
回复
create table iteminfo (itembm  varchar(20),      itemmc varchar(20))
insert into iteminfo values('1001' , '现金')
insert into iteminfo values('1002' , '银行存款')
insert into iteminfo values('1211' , '原材料')
insert into iteminfo values('1211001' , '精面粉')
insert into iteminfo values('1211001001', '双福精面粉')
create table pzb(itembm varchar(10), jfje int, dfje int, rq datetime)
insert into pzb values('1001' , 10 , 0 , '2009-02-19')
insert into pzb values('1002' , 0 , 10 , '2009-02-19')
insert into pzb values('1001' , 20 , 0 , '2009-02-19')
insert into pzb values('1211001001', 0 , 20 , '2009-02-19')

select m.itembm , isnull(sum(n.jfje),0) jfje , isnull(sum(n.dfje),0) dfje
from iteminfo m left join pzb n
on m.itembm like n.itembm + '%'
group by m.itembm


drop table iteminfo , pzb

/*
itembm jfje dfje
-------------------- ----------- -----------
1001 30 0
1002 0 10
1211 0 0
1211001 0 0
1211001001 0 20

(所影响的行数为 5 行)

警告: 聚合或其它 SET 操作消除了空值。
*/

22,209

社区成员

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

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