疑难问题

HappyQQ 2010-01-10 03:24:18
表TblCustomerTest有以下字段.
CustomerNo,CustomerName
'A001','A0001对应的名称'
'A002','A0002对应的名称'
'A003','A0003对应的名称'
'A004','A0004对应的名称'
'A005','A0005对应的名称'
'A006','A0006对应的名称'

表TblNode有以下字段(注MainBranch只取固定值'0001','0002','0003','0004',BankNodeNo 只取TblNode表字段NodeNo值字段)
NodeNo,NodeName,CustomerNo,MainBranch,BankNodeNo
内容如下,
'N0001','N0001Name','A001','0001','N0002'
'N0002','N0002Name','A001','0001','N0003'
'N0003','N0003Name','A003','0002,'N0003'
'N0004','N0004Name','A003','0002,'N0003'
'N0005','N0005Name','A004','0003,'N0004'
'N0006','N0006Name','A004','0004,'N0003'
'N0007','N0007Name','A005','0001,'N0003'
'N0008','N0008Name','A006','0003,'N0005'
'N0009','N0009Name','A006','0004,'N0005'

已知一个结果表TblReportB表:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,0
'A002','0002',1200,0
'A003','0002',1300,0

我需要核算TblReportB表中的OtherNum值.需要以下处理.

更新TblReportB的OtherNum字段需要符合以下要求.
统计TblNode的CustomerNo属于TblCustomerTest,且MainBranch属于固定值'0001','0002','0003','0004',
并且BankNodeNo属于TblNodes的值.

我的处理方式如下,但不是我想要的结果。
请大家帮我处理一下游标中的SQL语句。


DECLARE crsBranch CURSOR FORWARD_ONLY STATIC FOR
--四个固定值
Select BranchNo = '0001'
Union All
Select BranchNo = '0002'
Union All
Select BranchNo = '0003'
Union All
Select BranchNo = '0004'

OPEN crsBranch
FETCH NEXT FROM crsBranch INTO @MainBranch
WHILE @@FETCH_STATUS = 0
BEGIN

Update [TblReportB]
Set OtherNum = b.SNodeNum
From [TblReportB] as a
Join (
Select Cust.CustomerNo,SNodeNum = Count(*) From
TblNode Node
Left Join
TblCustomerTest Cust
On Cust.CustomerNo = Node.CustomerNo And Node.MainBranch=@MainBranch
And Node.BankNodeNo in
(
Select Node.NodeNo From
TblNode Node
Left Join
TblCustomerTest Cust
On Cust.CustomerNo = Node.CustomerNo And Node.MainBranch=@MainBranch
)
Group by Cust.CustomerNo
Having Cust.CustomerNo is not null
) as b
On a.CustomerNo =b.CustomerNo And MainBranch =@MainBranch
FETCH NEXT FROM crsBranch INTO @MainBranch
END

DEALLOCATE crsBranch



我需要的结果是:
预期结果表TblReportB表的值:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,2
'A002','0002',1200,0
'A003','0002',1300,2

哪位朋友帮帮忙。
...全文
140 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
HappyQQ 2010-01-14
  • 打赏
  • 举报
回复
原来是我第一个存储过程的错,那位帮助我的朋友,我们的结果都没错.

所以考虑问题以后一定不要认为自己的后来的程序有问题.
fanzhouqi 2010-01-10
  • 打赏
  • 举报
回复

if object_id('[TblCustomerTest]') is not null drop table [TblCustomerTest]
create table [TblCustomerTest] (CustomerNo varchar(4),CustomerName varchar(15))
insert into [TblCustomerTest]
select 'A001','A0001对应的名称' union all
select 'A002','A0002对应的名称' union all
select 'A003','A0003对应的名称' union all
select 'A004','A0004对应的名称' union all
select 'A005','A0005对应的名称' union all
select 'A006','A0006对应的名称'
--> 测试数据: [TblNode]
if object_id('[TblNode]') is not null drop table [TblNode]
create table [TblNode] (NodeNo varchar(5),NodeName varchar(9),CustomerNo varchar(4),MainBranch varchar(4),BankNodeNo varchar(5))
insert into [TblNode]
select 'N0001','N0001Name','A001','0001','N0002' union all
select 'N0002','N0002Name','A001','0001','N0003' union all
select 'N0003','N0003Name','A003','0002','N0003' union all
select 'N0004','N0004Name','A003','0002','N0003' union all
select 'N0005','N0005Name','A004','0003','N0004' union all
select 'N0006','N0006Name','A004','0004','N0003' union all
select 'N0007','N0007Name','A005','0001','N0003' union all
select 'N0008','N0008Name','A006','0003','N0005' union all
select 'N0009','N0009Name','A006','0004','N0005'

--> 测试数据: [TblReportB]
if object_id('[TblReportB]') is not null drop table [TblReportB]
create table [TblReportB] (CustomerNo varchar(4),MainBranch varchar(4),Cost int,OtherNum int)
insert into [TblReportB]
select 'A001','0001',1000,0 union all
select 'A002','0002',1200,0 union all
select 'A003','0002',1300,0

declare @t table(MainBranch varchar(4))
insert into @t
select '0001'
union all select '0002'
union all select '0003'
union all select '0004'

select CustomerNo,MainBranch,Cost
,OtherNum = (select count(1)
from [TblCustomerTest] b
inner join [TblNode] c on b.CustomerNo = c.CustomerNo
inner join @t d on c.MainBranch = d.MainBranch
where a.CustomerNo = b.CustomerNo)
from [TblReportB] a

CustomerNo MainBranch Cost OtherNum
---------- ---------- ----------- -----------
A001 0001 1000 2
A002 0002 1200 0
A003 0002 1300 2

(所影响的行数为 3 行)
??
pt1314917 2010-01-10
  • 打赏
  • 举报
回复
QQ:4693718
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
方便留下其他联系方式吗?

我这个问题苦恼了我一天了,其他我都算出来了,就差一个字段没核算出来了.

兄弟你的核算结果与我的SQL结果好像一样.
pt1314917 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 happyqq 的回复:]
兄弟还是不行,结果并不是我想要的.
能否再想想办法.
[/Quote]

怎么不是呢?我理解错了?
--> 测试数据: [TblCustomerTest]
if object_id('[TblCustomerTest]') is not null drop table [TblCustomerTest]
create table [TblCustomerTest] (CustomerNo varchar(4),CustomerName varchar(15))
insert into [TblCustomerTest]
select 'A001','A0001对应的名称' union all
select 'A002','A0002对应的名称' union all
select 'A003','A0003对应的名称' union all
select 'A004','A0004对应的名称' union all
select 'A005','A0005对应的名称' union all
select 'A006','A0006对应的名称'
--> 测试数据: [TblNode]
if object_id('[TblNode]') is not null drop table [TblNode]
create table [TblNode] (NodeNo varchar(5),NodeName varchar(9),CustomerNo varchar(4),MainBranch varchar(4),BankNodeNo varchar(5))
insert into [TblNode]
select 'N0001','N0001Name','A001','0001','N0002' union all
select 'N0002','N0002Name','A001','0001','N0003' union all
select 'N0003','N0003Name','A003','0002','N0003' union all
select 'N0004','N0004Name','A003','0002','N0003' union all
select 'N0005','N0005Name','A004','0003','N0004' union all
select 'N0006','N0006Name','A004','0004','N0003' union all
select 'N0007','N0007Name','A005','0001','N0003' union all
select 'N0008','N0008Name','A006','0003','N0005' union all
select 'N0009','N0009Name','A006','0004','N0005'

--> 测试数据: [TblReportB]
if object_id('[TblReportB]') is not null drop table [TblReportB]
create table [TblReportB] (CustomerNo varchar(4),MainBranch varchar(4),Cost int,OtherNum int)
insert into [TblReportB]
select 'A001','0001',1000,0 union all
select 'A002','0002',1200,0 union all
select 'A003','0002',1300,0

update [TblReportB] set othernum=cnt
from [TblReportB] a,
(select customerno,cnt=count(*) from [TblNode] c where exists(select 1 from tblnode where nodeno=c.banknodeno) group by customerno)b
where a.customerno=b.customerno

--查看结果:
select * from [TblReportB]
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
兄弟还是不行,结果并不是我想要的.
能否再想想办法.
pt1314917 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 happyqq 的回复:]
兄弟,你没有把BankNodeNo 考虑进去.

在核算时,需要将核算的条件都要考虑进去.
[/Quote]


--try:
update [TblReportB] set othernum=cnt
from [TblReportB] a,
(select customerno,cnt=count(*) from [TblNode] c where exists(select 1 from tblnode where nodeno=c.banknodeno) group by customerno)b
where a.customerno=b.customerno

HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
兄弟,你没有把BankNodeNo 考虑进去.

在核算时,需要将核算的条件都要考虑进去.
pt1314917 2010-01-10
  • 打赏
  • 举报
回复
--> 测试数据: [TblCustomerTest]
if object_id('[TblCustomerTest]') is not null drop table [TblCustomerTest]
create table [TblCustomerTest] (CustomerNo varchar(4),CustomerName varchar(15))
insert into [TblCustomerTest]
select 'A001','A0001对应的名称' union all
select 'A002','A0002对应的名称' union all
select 'A003','A0003对应的名称' union all
select 'A004','A0004对应的名称' union all
select 'A005','A0005对应的名称' union all
select 'A006','A0006对应的名称'
--> 测试数据: [TblNode]
if object_id('[TblNode]') is not null drop table [TblNode]
create table [TblNode] (NodeNo varchar(5),NodeName varchar(9),CustomerNo varchar(4),MainBranch varchar(4),BankNodeNo varchar(5))
insert into [TblNode]
select 'N0001','N0001Name','A001','0001','N0002' union all
select 'N0002','N0002Name','A001','0001','N0003' union all
select 'N0003','N0003Name','A003','0002','N0003' union all
select 'N0004','N0004Name','A003','0002','N0003' union all
select 'N0005','N0005Name','A004','0003','N0004' union all
select 'N0006','N0006Name','A004','0004','N0003' union all
select 'N0007','N0007Name','A005','0001','N0003' union all
select 'N0008','N0008Name','A006','0003','N0005' union all
select 'N0009','N0009Name','A006','0004','N0005'

--> 测试数据: [TblReportB]
if object_id('[TblReportB]') is not null drop table [TblReportB]
create table [TblReportB] (CustomerNo varchar(4),MainBranch varchar(4),Cost int,OtherNum int)
insert into [TblReportB]
select 'A001','0001',1000,0 union all
select 'A002','0002',1200,0 union all
select 'A003','0002',1300,0


update [TblReportB] set othernum=cnt
from [TblReportB] a,
(select customerno,cnt=count(*) from [TblNode] group by customerno)b
where a.customerno=b.customerno

--查看结果:
select * from [TblReportB]

--结果:

CustomerNo MainBranch Cost OtherNum
---------- ---------- ----------- -----------
A001 0001 1000 2
A002 0002 1200 0
A003 0002 1300 2

HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
Select Cust.CustomerNo,SNodeNum = Count(*) From
TblNode Node
Left Join
TblCustomerTest Cust
On Cust.CustomerNo = Node.CustomerNo And Node.MainBranch=@MainBranch
And Node.BankNodeNo in
(
Select Node.NodeNo From
TblNode Node
Left Join
TblCustomerTest Cust
On Cust.CustomerNo = Node.CustomerNo And Node.MainBranch=@MainBranch
)
Group by Cust.CustomerNo
Having Cust.CustomerNo is not null


以上我的思路,但结果不是我想要的.
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
标红色的记录是属于我要求的记录.
所以最后

TblReportB表的值将是:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,2
'A002','0002',1200,0
'A003','0002',1300,2
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
未核算之前
TblReportB表已存在以下记录:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,0
'A002','0002',1200,0
'A003','0002',1300,0

核算之后的值:
TblReportB表:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,2
'A002','0002',1200,0
'A003','0002',1300,2

核算的条件是:
统计TblNode表中CustomerNo属于TblCustomerTest,且MainBranch属于固定值'0001','0002','0003','0004',
并且TblNode表中BankNodeNo字段值属于TblNode的NodeNo字段.

表TblNode
NodeNo,NodeName,CustomerNo,MainBranch,BankNodeNo
'N0001','N0001Name','A001','0001','N0002'
'N0002','N0002Name','A001','0001','N0003'
'N0003','N0003Name','A003','0002,'N0003'
'N0004','N0004Name','A003','0002,'N0003'

'N0005','N0005Name','A004','0003,'N0004'
'N0006','N0006Name','A004','0004,'N0003'
'N0007','N0007Name','A005','0001,'N0003'
'N0008','N0008Name','A006','0003,'N0005'
'N0009','N0009Name','A006','0004,'N0005'


pt1314917 2010-01-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 happyqq 的回复:]
不好意思,第一次在这上面发这么长的问题,也不知道如何方便你们处理我的问题.

[/Quote]

还把TblReportB表的数据贴出来。另外把想要的结果。以及得到结果的规律说一下。
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
不好意思,第一次在这上面发这么长的问题,也不知道如何方便你们处理我的问题.
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
已知一个结果表TblReportB表:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,0
'A002','0002',1200,0
'A003','0002',1300,0


我需要核算TblReportB表中的OtherNum值.需要以下处理.
条件是:
统计TblNode的CustomerNo属于TblCustomerTest,且MainBranch属于固定值'0001','0002','0003','0004',
并且BankNodeNo属于TblNodes的值.
正确的结果是:
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,2
'A002','0002',1200,0
'A003','0002',1300,2

其他,请参考我的那段SQL语句.



alexjack1210 2010-01-10
  • 打赏
  • 举报
回复
楼主你题目怎么这么长,都晕了!你要得到什么样的结果咯?
netcup 2010-01-10
  • 打赏
  • 举报
回复
太长了,看着晕,。另外,麻烦提问者把建表语句和插入数据的语句都写好,别人省了时间了
pt1314917 2010-01-10
  • 打赏
  • 举报
回复
CustomerNo,MainBranch,Cost,OtherNum
'A001','0001',1000,2
'A002','0002',1200,0
'A003','0002',1300,2

---------------
能说说你这结果是怎么来的吗?
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
顶起来,高手们,帮帮忙.
HappyQQ 2010-01-10
  • 打赏
  • 举报
回复
顶起来,高手们,帮帮忙.
加载更多回复(3)
第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。   第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。   第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。   第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。   第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。   第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。   第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、使用注解进行配置等内容。   第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访问模板等内容。   第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。   第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。   第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。   第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。   第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。   第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。   第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。   第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。   第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、项目设计、代码开发、单元测试直到应用部署经历整个实际项目的整体开发过程。

22,300

社区成员

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

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