改写了一个通用的交叉报表可是提示出错

ppxstar 2009-03-09 10:35:51
过程如下
====================

CREATE PROCEDURE 通用组合统计报表

@主表 varchar(100),
@行表 varchar(100),
@列表 varchar(100),
@列名 varchar(50),
@行表字段 varchar(50),
@列表字段 varchar(50),
@主行字段 varchar(50),
@主列字段 varchar(50)

AS
BEGIN

SET NOCOUNT ON;

declare @sql varchar(8000)
declare @sql2 varchar(1000)
set @sql = 'select t1.'+@列表字段+' as '+@列名+' , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.'+@主行字段+' when ''' + @行表字段 + ''' then 1 else 0 end) [' + @行表字段 + ']'
set @sql =@sql + 'from (select distinct '+@行表字段+' from '+@行表+') as a'
set @sql = @sql + ' from '+@列表+' t1 left join '+@主表+' t2 on t1.'+@列表字段+' = t2.'+@主列字段+' group by t1.'+@主列字段
exec(@sql)

建立成功
====================
运行后出现
消息 156,级别 15,状态 1,第 1 行
关键字 'from' 附近有语法错误。

(1 行受影响)
的错误提示

但找不到错误原因是什么,请朋友帮忙看一下。
...全文
153 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppxstar 2009-03-13
  • 打赏
  • 举报
回复
from前面的空早就试过了,不行
ks_reny 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
print(@sql) 看看.
[/Quote]
应该是 from前面少个空格。
ppxstar 2009-03-11
  • 打赏
  • 举报
回复
修改成这样
ALTER PROCEDURE [dbo].[ECSP_通用组合统计报表]
-- Add the parameters for the stored procedure here
@主表 varchar(100)='员工基本信息',
@行表 varchar(100)='职称类别',
@列表 varchar(100)='学历类型',
@列名 varchar(50)='学历类型',
@行表字段 varchar(50)='职称类别',
@列表字段 varchar(50)='学历类型',
@主行字段 varchar(50)='职称',
@主列字段 varchar(50)='学历'

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
declare @sql varchar(8000)
set @sql = 'select t1.'+@列表字段+' as '+@列名+' , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.'+@主行字段+' when '''+@行表字段+''' then 1 else 0 end) ['+@行表字段+'] '
from (select distinct 职称类别 from 职称类别) as a
set @sql = @sql + ' from '+@列表+' t1 left join '+@主表+' t2 on t1.'+@列表字段+' = t2.'+@主列字段+' group by t1.'+@列表字段
print(@sql)
exec(@sql)
END
==============================
sql结果是
select t1.学历类型 as 学历类型 , count(*) 合计 , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历类型

这不是我要的结果

因为所有行表字段全是职称类别,而实际上我要的行表字段应当是不同的,从“行表”的“行表字段”里提取的值。

==========================================================================
下面是一段正常执行,但不通用的代码
declare @sql varchar(8000)
set @sql = 'select t1.学历类型 , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.职称 when ''' + 职称类别 + ''' then 1 else 0 end) [' + 职称类别 + ']'
from (select distinct 职称类别 from 职称类别) as a
set @sql = @sql + ' from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历类型'
exec(@sql)

得出结果是我想要的,如下:
select t1.学历类型 , count(*) 合计 , sum(case t2.职称 when '初级(师)' then 1 else 0 end) [初级(师)] , sum(case t2.职称 when '初级(士)' then 1 else 0 end) [初级(士)] , sum(case t2.职称 when '副高' then 1 else 0 end) [副高] , sum(case t2.职称 when '无职称' then 1 else 0 end) [无职称] , sum(case t2.职称 when '正高' then 1 else 0 end) [正高] , sum(case t2.职称 when '中级' then 1 else 0 end) [中级] from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历类型

=========================================

ppxstar2 2009-03-11
  • 打赏
  • 举报
回复
晕死,这道题无人帮我呀,此地大佬dawugui 爱新觉罗.毓华,万请帮忙呀。
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
楼上方法不行
set @sql =@sql + 'from (select distinct '+@行表字段+'as '+@行表字段+' from '+@行表+') as a'
这一句输出了,但其实是需要select distinct '+@行表字段+'as '+@行表字段+' from '+@行表+'这一段执行,最终语句
这一行是不出现的
sdhdy 2009-03-09
  • 打赏
  • 举报
回复
接上,因为没有别名,他取不到表里的值,所以他还是取默认的:@行表字段 varchar(50)='职称类别
sdhdy 2009-03-09
  • 打赏
  • 举报
回复
CREATE PROCEDURE 通用组合统计报表 

@主表 varchar(100),
@行表 varchar(100),
@列表 varchar(100),
@列名 varchar(50),
@行表字段 varchar(50),
@列表字段 varchar(50),
@主行字段 varchar(50),
@主列字段 varchar(50)

AS
BEGIN

SET NOCOUNT ON;

declare @sql varchar(8000)
declare @sql2 varchar(1000)
set @sql = 'select t1.'+@列表字段+' as '+@列名+' , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.'+@主行字段+' when ''' + @行表字段 + ''' then 1 else 0 end) [' + @行表字段 + ']'
--下面这句有问题,你要给@行表字段个别名***************************************************
set @sql =@sql + 'from (select distinct '+@行表字段+'as '+@行表字段+' from '+@行表+') as a'
set @sql = @sql + ' from '+@列表+' t1 left join '+@主表+' t2 on t1.'+@列表字段+' = t2.'+@主列字段+' group by t1.'+@主列字段

--将@sql打印出来看看****************************************************
print @sql
exec(@sql)
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
好像是 from (select distinct 职称类别 from 职称类别) as a 这一段直接输出没执行

于是我把
set @sql =@sql + 'from (select distinct '+@行表字段+' from '+@行表+') as a'
替换成
from (select distinct 职称类别 from 职称类别) as a

结果如下:
select t1.学历类型 as 学历类型 , count(*) 合计 , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别] from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历

可以看出,from (select distinct 职称类别 from 职称类别) as a是执行了,
但是对应的字段值却没有替换过来。


默认值
@主表 varchar(100)='员工基本信息',
@行表 varchar(100)='职称类别',
@列表 varchar(100)='学历类型',
@列名 varchar(50)='学历类型',
@行表字段 varchar(50)='职称类别',
@列表字段 varchar(50)='学历类型',
@主行字段 varchar(50)='职称',
@主列字段 varchar(50)='学历'
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
正常执行应当是
select t1.学历类型 as 学历类型 , count(*) 合计 , sum(case t2.职称 when '初级(师)' then 1 else 0 end) [初级(师)] , sum(case t2.职称 when '初级(士)' then 1 else 0 end) [初级(士)] , sum(case t2.职称 when '副高' then 1 else 0 end) [副高] , sum(case t2.职称 when '无职称' then 1 else 0 end) [无职称] , sum(case t2.职称 when '正高' then 1 else 0 end) [正高] , sum(case t2.职称 when '中级' then 1 else 0 end) [中级] from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历类型


实际执行后是

select t1.学历类型 as 学历类型 , count(*) 合计 , sum(case t2.职称 when '职称类别' then 1 else 0 end) [职称类别]from (select distinct 职称类别 from 职称类别) as a from 学历类型 t1 left join 员工基本信息 t2 on t1.学历类型 = t2.学历 group by t1.学历类型



dawugui 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ppxstar 的回复:]
测试了,不是那个空格的问题


而是
sum(case t2.'+@主行字段+' when ''' + @行表字段 + ''' then 1 else 0 end) [' + @行表字段 + ']'

这一段没有转换成我要与数据库字段相对应的内容。

但应当怎么写呢?
[/Quote]
print(@sql),贴出来.
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
测试了,不是那个空格的问题


而是
sum(case t2.'+@主行字段+' when ''' + @行表字段 + ''' then 1 else 0 end) [' + @行表字段 + ']'

这一段没有转换成我要与数据库字段相对应的内容。

但应当怎么写呢?
mycool2006 2009-03-09
  • 打赏
  • 举报
回复
set @sql =@sql + 'from (select distinct '+@行表字段+' from '+@行表+') as a'

这个FROM 觉得前面要加个空格哈
rucypli 2009-03-09
  • 打赏
  • 举报
回复
把最后一个'from'改成','
dawugui 2009-03-09
  • 打赏
  • 举报
回复
set @sql =@sql + ' from (select distinct '+@行表字段+' from '+@行表+') as a' --from前加个空格
set @sql = @sql + ' from '+@列表+' t1 left join '+@主表+' t2 on t1.'+@列表字段+' = t2.'+@主列字段+' group by t1.'+@列表字段 --你最后group by的字段有问题吧?
mycool2006 2009-03-09
  • 打赏
  • 举报
回复
楼主试试 每个FROM 前面加个空格
dawugui 2009-03-09
  • 打赏
  • 举报
回复
print(@sql) 看看.
sdhdy 2009-03-09
  • 打赏
  • 举报
回复

CREATE PROCEDURE 通用组合统计报表

@主表 varchar(100),
@行表 varchar(100),
@列表 varchar(100),
@列名 varchar(50),
@行表字段 varchar(50),
@列表字段 varchar(50),
@主行字段 varchar(50),
@主列字段 varchar(50)

AS
BEGIN

SET NOCOUNT ON;

declare @sql varchar(8000)
declare @sql2 varchar(1000)
set @sql = 'select t1.'+@列表字段+' as '+@列名+' , count(*) 合计 '
select @sql = @sql + ' , sum(case t2.'+@主行字段+' when ''' + @行表字段 + ''' then 1 else 0 end) [' + @行表字段 + ']'
set @sql =@sql + 'from (select distinct '+@行表字段+' from '+@行表+') as a'
set @sql = @sql + ' from '+@列表+' t1 left join '+@主表+' t2 on t1.'+@列表字段+' = t2.'+@主列字段+' group by t1.'+@主列字段

--将@sql打印出来看看****************************************************
print @sql
exec(@sql)
ChinaJiaBing 2009-03-09
  • 打赏
  • 举报
回复

语法貌似没有问题...
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
就上面两句怎么把固定的表名和字段名用变量代替呀。
ppxstar 2009-03-09
  • 打赏
  • 举报
回复
或者说
select @sql = @sql + ' , sum(case t2.职称 when ''' +职称类别+ ''' then 1 else 0 end) [' + 职称类别 + ']'
from (select distinct 职称类别 from 职称类别) as a

这里的汉字如何用变量代替。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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