问题一:create table duizhao
(
id int identity(1,1) ,
zyid varchar(10),
zyname varchar(10),
gsid varchar(10),
gsnames varchar(10)
)insert into duizhao select '001', 'aaa', '100', 'aaab'
union all select '001', 'aaa', '101', 'aaac'
union all select '001', 'aaa', '102', 'aaad'
union all select '002', 'bbb', '103', 'bbbc'
union all select '002', 'bbb', '104', 'bbbf'
union all select '003', 'ccc', '105', 'cccs'
union all select '004', 'ddd', '106', 'dddf'
union all select '005', 'eee', '107', 'eees'
union all select '006', 'fff', '108', 'fffs'
union all select '006', 'ggg', '109', 'ggsd'create table t_login
(
id int ,
gsid varchar(10),
公司名称 varchar(10),
用户名 varchar(10),
查询范围 varchar(100)
)insert into t_login select 21, '100', 'aaab', 'alibaba', '100,103,106,107,109'select * from duizhao
select * from t_login
select a.gsid
from duizhao a
join
(
select zyid
from duizhao d
join t_login on 查询范围 like '%'+d.gsid +'%'
) t on a.zyid = t.zyid
gsid
----------
100
101
102
103
104
106
107
108
109(所影响的行数为 9 行)
(
id int identity(1,1) ,
zyid varchar(10),
zyname varchar(10),
gsid varchar(10),
gsnames varchar(10)
)insert into duizhao select '001', 'aaa', '100', 'aaab'
union all select '001', 'aaa', '101', 'aaac'
union all select '001', 'aaa', '102', 'aaad'
union all select '002', 'bbb', '103', 'bbbc'
union all select '002', 'bbb', '104', 'bbbf'
union all select '003', 'ccc', '105', 'cccs'
union all select '004', 'ddd', '106', 'dddf'
union all select '005', 'eee', '107', 'eees'
union all select '006', 'fff', '108', 'fffs'
union all select '006', 'ggg', '109', 'ggsd'create table t_login
(
id int ,
gsid varchar(10),
公司名称 varchar(10),
用户名 varchar(10),
查询范围 varchar(100)
)insert into t_login select 21, '100', 'aaab', 'alibaba', '100,103,106,107,109'select * from duizhao
select * from t_login
select a.gsid
from duizhao a
join
(
select zyid
from duizhao d
join t_login on 查询范围 like '%'+d.gsid +'%'
) t on a.zyid = t.zyid
gsid
----------
100
101
102
103
104
106
107
108
109(所影响的行数为 9 行)
set @user='alibaba'select gsid from duizhao
where zyid in (select zyid from duizhao a
inner join t_login b
on charindex(','+a.gsid+',' ,','+b.[查询范围]+',' )>0
and b.[用户名]=@user
)
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0-----------------
能不能解释一下这句的作用是什么?或是没有左右?
而且
101 aaab asrock 2007-01-07 2007-02-08 400 300
102 aaad ds 2007-01-05 2007-03-05 600 550
以上数据,公司名称和id与表duizhao不一致.
from (select * from shenp
union all
select * from v_shenp
) T1
inner join
(select A.gsid ,sum(A.批复金额) as 批复金额
from
(select * from shenp
union all
select * from v_shenp
) A
where (charindex(','+rtrim(A.gsid)+',' ,','+@company+',')>0 or isnull(@company,'')='0')
and A.批复日期 >=isnull(@start,'1900-01-01')
and A.批复日期<=isnull(@end,'2999-01-01')
and A.审批意见='同意'
group by A.gsid) T2
on T1.gsid=T2.gsid
group by T1.公司名称
set @user='alibaba'select gsid from duizhao
where zyid in (select zyid from duizhao a
inner join t_login b
on charindex(','+rtrim(a.gsid)+',' ,','+b.[查询范围]+',' )>0
and b.[用户名]=@user
)--2.trydeclare @company varchar(200),@start datetime,@end datetimeselect T1.公司名称, sum(T2. 批复金额) as [借款额]
from (select * from shenp
union all
select * from v_shenp
) T1
inner join
(select A.gsid ,sum(A.批复金额) as 批复金额
from
(select * from shenp
union all
select * from v_shenp
) A
where (charindex(','+rtrim(A.gsid)+',' ,','+@company+',')>0 or isnull(@company,'')='0')
and A.批复日期 >=isnull(@start,'1900-01-01')
and A.批复日期<=isnull(@end,'2999-01-01')
and A.审批意见='同意'
group by A.gsid) T2
on T1.gsid=T2.gsid
group by T1.公司名称
declare @username varchar(10)
set @username='alibaba'
select * from duizhao where zyid in (select zyid from duizhao a,t_login b where charindex(','+a.gsid+',',','+b.查询范围+',')>0)
create proc test_zjreport_release
(
@companyname varchar(1000)=null,
@startdate datetime=null,
@enddate datetime=null
)
as
begin select 公司名称 ,sum(申请用款总额) as 借款额
from
(
select 公司id,公司名称,sum(批复金额) as 申请用款总额
from
(
select * from shenp
union all
select * from v_shenp
) t
where 审批意见='同意' --不知道你的审批意见这一列从哪里来的?
and (@companyname is null or @companyname ='0'
or 公司id in
(select a.gsid
from duizhao a
join
(
select zyid
from duizhao d
join t_login on 查询范围 like '%'+d.gsid +'%'
) t on a.zyid = t.zyid )
and A.批复日期 >=isnull(@start,'1900-01-01')
and A.批复日期 <=isnull(@end,'2999-01-01')
group by 公司id,公司名称
) a
group by 公司名称end 没有测试过,不过对于楼主你给的数据和例子都有问题...
建议:需要细心
问题二:我觉得使用存储过程结合游标可以实现,可能效率比较低的
我没有测试过,自己去试试吧create proc T
as
begin DECLARE @cdbname varchar(15),@fa int
declare @t table (FFrameWorkID int ,cdbname varchar(100),cacc_name varchar(50),FDatabaseLocation varchar(10),fa int)
insert into @t FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
select DISTINCT FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
from master.dbo.aaa
join bbb.dbo.t_GR_FrameWork
on master.dbo.aaa.cacc_name= bbbdbo.t_GR_FrameWork.FK3DataSourceName DECLARE ak47_cursor CURSOR FOR
select cdbname
from @t OPEN ak47_cursor
FETCH NEXT FROM ak47_cursor
INTO @cdbname
WHILE @@FETCH_STATUS = 0
BEGIN
sp_executesql 'select @fa = fa from '+@cdbname+'.dbo.t_itemclass where t_itemclassid=4 ',N'@fa int output ',@fa output
update a set fa = @fa
from @t a
where cdbname =@cdbname
FETCH NEXT FROM ak47_cursor
INTO @cdbname
END
CLOSE ak47_cursor
DEALLOCATE ak47_cursorselect * from @t
end
---------------------------------------------------
服务器: 消息 170,级别 15,状态 1,过程 T,行 8
第 8 行: 'FFrameWorkID' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,过程 T,行 26
第 26 行: 'sp_executesql' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,过程 T,行 43
在关键字 'end' 附近有语法错误。
老大的解法会出现二个问题1:用户无输入参数时结果集为空值 2.统计数据不正确,可能还是我的表达有问题,郁闷!
xiaoku(野蛮人(^v^))
老大的解法也有上面的问题关于问题2的解决思路我了解了,语法检查有些问题,我再试看看!
===============================唉,其实在我的语句基础上修改才是最好的办法,因为这个破东西涉及东西太多,而我又讲不清,可是..........唉
(
@companyname varchar(1000)=null,
@startdate datetime=null,
@enddate datetime=null
)
as
begin
select 公司名称zy as 公司名称,sum(申请用款总额) as 借款额 from
(
select 公司id,公司名称,sum(批复金额) as 申请用款总额
from
(
select * from v_shenp
union all
select * from shenp
) tt1
where 审批意见='同意'
/* ----大家注意其实这个存储过程出问题的部份就这个加注释的中间的部份,而且case when @companyname is null or @companyname = 0 then gsid这一部份也是正常的,不正常的是else以后的--- */
and
gsid in (
case when @companyname is null or @companyname = 0 then gsid else
(select gsid from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid ))
end )
/* ------------------------------------------------------------ */
and 请求时间>(case when @startdate is null then 请求时间-1 else @startdate end)
and 请求时间<(case when @enddate is null then 请求时间+1 else @enddate end)
group by 公司id,公司名称
)tt ,duizhao aa where tt.公司id = aa.gsid group by 公司名称zy
end
GO
大哥,从这个过程中下手解决一下好吗?
case when XX then A
else B
endA和B要同一类型的,这里你then后面是gsid而else后面是一个(select * from XX)的结果集.
把gsid也换成结果集试下也可
as
begin DECLARE @cdbname varchar(15),@fa int
declare @sql varchar(1000) --这里我重新定义了一个执行的sql语句变量
declare @t table (FFrameWorkID int ,cdbname varchar(100),cacc_name varchar(50),FDatabaseLocation varchar(10),fa int)
insert into @t ( FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation) --这里之前没有 () 呵呵,我也粗心
select DISTINCT FFrameWorkID ,cdbname,cacc_name,FDatabaseLocation
from master.dbo.aaa
join bbb.dbo.t_GR_FrameWork
on master.dbo.aaa.cacc_name= bbbdbo.t_GR_FrameWork.FK3DataSourceName DECLARE ak47_cursor CURSOR FOR
select cdbname
from @t OPEN ak47_cursor
FETCH NEXT FROM ak47_cursor
INTO @cdbname
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql ='select @fa = fa from '+ @cdbname +'.dbo.t_itemclass where t_itemclassid=4 '
exec sp_executesql @sql,N'@fa int output ',@fa output --估计之前这个函数不应许语句中间使用变量
update a set fa = @fa
from @t a
where cdbname =@cdbname
FETCH NEXT FROM ak47_cursor
INTO @cdbname
END
CLOSE ak47_cursor
DEALLOCATE ak47_cursorselect * from @t
end
--我分析查询了以下 成功!
感觉,语句是没有问题!
谢谢老大的指点,语句检查无误,但执行出了点小问题:(所影响的行数为 6 行)服务器: 消息 214,级别 16,状态 2,过程 sp_executesql,行 28
过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
看样子说明出结果了,但是还有这个错误,不太清楚,没有这方面的经验,正在查资料
case when XX then A
else B
endA和B要同一类型的,这里你then后面是gsid而else后面是一个(select * from XX)的结果集.
把gsid也换成结果集试下也可
+++++++++++++++++++++++
playwarcraft(时间就像乳沟,挤挤还是有的)
老大,我明白你的意思了,但是不清楚要如何把gsid也换成结果集,这个还要如何换呢?
把语句贴出来看看?
服务器: 消息 512,级别 16,状态 1,过程 zjreport_release,行 12
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
存储过程: sms.dbo.zjreport_release
返回代码 = -6
我是COPY你的代码来的
进行分组求合的数据报表,得出每一个公司按输入日期或是全年的统计数据,这个存储过程有三个参数,一个是@companyname,输入
参数的形式是如215,125,455之类,或是为null 或是为0,为NULL或是为0,则查询全部公司的“批复金额”的汇总数据,如果
为具体的数组,则会按照问题1的需求逻辑将输入的数组进行处理,将得出的公司的数据按gsid进行分组,
@startdate指开始时间(指的是“批复日期”字段) @enddate是结束时间,也就是用户可以指定一个时间段进行查询全部或是某一个
或是某几个公司的“批复金额”汇总数据,需要特别指出的是这三个参数都有为空或不为空的时侯。
-----------------
这个搞定了没有?
(select gsid from duizhaobiao as tmp
where exists
(
select * from duizhaobiao as tmpA
where exists
(
select 1 from t_userlogin
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid ))只是把它加入case when 中就出错
我宁愿使用 or
+++++++++++++++++++++++问题二还有些问题:
执行可以正常执行了,但是fa字段的值都是NULL
并且会有错误提示:(所影响的行数为 6 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '006.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '005.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '004.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '003.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '002.dbo.t_itemclass' 无效。(所影响的行数为 0 行)服务器: 消息 208,级别 16,状态 1,行 1
对象名 '001.dbo.t_itemclass' 无效。(所影响的行数为 0 行)
(所影响的行数为 6 行)存储过程: master.dbo.T
返回代码 = 0
select fa from cdbname.dbo.t_itemclass where t_itemclassid='4'是有结果的啊
DECLARE @cdbname varchar(15)
原来你定义的是15,结果比我们真实的少了二位,改成17,OK了!
(select gsid from duizhaobiao as tmp
where exists
(
select * from duizhaobiao as tmpA
where exists
(
select 1 from t_userlogin
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid ))只是把它加入case when 中就出错
就是我那个存储过程啊
服务器: 消息 245,级别 16,状态 1,过程 zjreport_release,行 10
将 varchar 值 '125,415' 转换为数据类型为 int 的列时发生语法错误。
@companyname 为NULL 或是为 o 时正常执行
and
gsid in (
----------------------------------------------
(select gsid from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid ))
)
/* ------------------------------------------------------------ */
也是可以正常执行的,不知我这样描述能不能看懂
gsid in (
case when @companyname is null or @companyname = 0 then gsid else
(select gsid from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid ))
end )------------
oh 前面已经有同志说明了,case when 之后的两个数据是相同类型的,而你不是!改改...不使用case when
(select gsid from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid )
)
)
)
服务器: 消息 245,级别 16,状态 1,过程 zjreport_release,行 10
将 varchar 值 '125,254' 转换为数据类型为 int 的列时发生语法错误。
(select gsid from duizhaobiao as tmp
where exists
(
select * from duizhaobiao as tmpA
where exists
(
select 1 from t_userlogin
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid )
)
)
--or @companyname is null or @companyname = 0 注释掉最后一句不会报错,加上就报错!但分开的这两段是可以执行的
(select gsid from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where charindex(','+rtrim(tmpA.gsid)+',',','+@companyname+',')>0
) and tmpA.zyid = tmp.zyid )
)
)
)