go if OBJECT_ID('report')is not null drop table report go create table report( 销售员 varchar(10), 销售组 varchar(8), 产品名称 varchar(10), 产品组别 varchar(10), 销售金额 money, 销售日期 date, ) go insert report select '周','A','产品1','产品甲组',10000,'2012-04-01' union all select '王','B','产品2','产品乙组',0,'2012-04-03' union all select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all select '李','C','产品3','产品甲组',30000,'2012-04-09' union all select '孙','B','产品2','产品乙组',1,'2012-04-11' go declare @str varchar(max) set @str='' select @str=@str+','+产品组别+'个数=count(case when 产品组别='+QUOTENAME(产品组别,'''')+ ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+ ' then 销售金额 else 0 end)' from report group by 产品组别 exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组') --是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。 /* 销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额 A 1 10000.00 1 0.00 10000.00 B 3 50000.00 3 1.00 50001.00 C 1 30000.00 1 0.00 30000.00 */
go if OBJECT_ID('report')is not null drop table report go create table report( 销售员 varchar(10), 销售组 varchar(8), 产品名称 varchar(10), 产品组别 varchar(10), 销售金额 money, 销售日期 date, ) go insert report select '周','A','产品1','产品甲组',10000,'2012-04-01' union all select '王','B','产品2','产品乙组',0,'2012-04-03' union all select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all select '李','C','产品3','产品甲组',30000,'2012-04-09' union all select '孙','B','产品2','产品乙组',1,'2012-04-11' go declare @str varchar(max) set @str='' select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+ ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+ ' then 销售金额 else 0 end)' from report group by 产品组别 exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组') --是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。 /* 销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额 A 1 10000.00 0 0.00 10000.00 B 1 50000.00 2 1.00 50001.00 C 1 30000.00 0 0.00 30000.00 */--应该这样,楼上作废
我那号被封了,换这个号,你试试下面的语句,我觉得不应该是quotename的问题 declare @str varchar(max) set @str='' select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+'''产品组别'''+ ' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+'''产品组别'''+ ' then 销售金额 else 0 end)' from report group by 产品组别 exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组')
实在没搞懂,放到实际数据库运行直接报错: declare @str varchar(max) set @str='' select @str=@str+','+产品类型+'个数=sum(case when 产品类型='+'''产品类型'''+ ' then 1 else 0 end),'+产品类型+'金额=sum(case when 产品类型='+'''产品类型'''+ ' then 签约资产 else 0 end)' from 销售情况表 group by 产品类型 exec('select 销售小组'+@str+',sum(签约资产) as 总金额 from 销售情况表 group by 销售小组') /* 消息 102,级别 15,状态 1,第 1 行 '=' 附近有语法错误。 */
找到原因了:实际数据库的 销售金额 和 产品组别这些字段的类型都是nchar,测试数据用的varchar...怎么改语句? 假设测试数据是这样: go if OBJECT_ID('report')is not null drop table report go create table report( 销售员 nchar(10), 销售组 nchar(8), 产品名称 nchar(10), 产品组别 nchar(10), 销售金额 money, 销售日期 date, ) go insert report select '周','A','产品1','产品甲组',10000,'2012-04-01' union all select '王','B','产品2','产品乙组',0,'2012-04-03' union all select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all select '李','C','产品3','产品甲组',30000,'2012-04-09' union all select '孙','B','产品2','产品乙组',1,'2012-04-11'
declare @str varchar(max) set @str='select 销售组' select @str=@str+',sum(case when 产品组别='''+产品组别+''' then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+''' then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report group by 产品组别 set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组' print @str exec(@str)
declare @str varchar(max) set @str='select 销售组' select @str=@str+',sum(case when 产品组别='''+产品组别+''' then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+''' then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report group by 产品组别 set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组' print @str exec(@str)
感谢,测试通过! 再加深一步:如果要将上述查询的结果保存为一个临时的记录集,改如何写?因为有可能需要对这个记录集进行另外条件的查询,比如将某些金额或个数用特定条件汇总输出。 比如用 with a as 将上述查询得到的记录集保存到临时记录集a中,再对a进行条件查询。
declare @str varchar(max) set @str='with t as (select 销售组' select @str=@str+',sum(case when 产品组别='''+产品组别+''' then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+''' then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report group by 产品组别 set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组) select *from t' print @str exec(@str)
我要对临时表t进行条件查询输出就在 select * from t 里面改是吧?但我改成 select * from t where 销售组='A' 回报‘销售组’附近有语法错误?
go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售员 varchar(10),
销售组 varchar(8),
产品名称 varchar(10),
产品组别 varchar(10),
销售金额 money,
销售日期 date,
)
go
insert report
select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
select '王','B','产品2','产品乙组',0,'2012-04-03' union all
select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
select '孙','B','产品2','产品乙组',1,'2012-04-11'
go
declare @str varchar(max)
set @str=''
select @str=@str+','+产品组别+'个数=count(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 销售金额 else 0 end)' from report
group by 产品组别
exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组')
--是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。
/*
销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额
A 1 10000.00 1 0.00 10000.00
B 3 50000.00 3 1.00 50001.00
C 1 30000.00 1 0.00 30000.00
*/
go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售员 varchar(10),
销售组 varchar(8),
产品名称 varchar(10),
产品组别 varchar(10),
销售金额 money,
销售日期 date,
)
go
insert report
select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
select '王','B','产品2','产品乙组',0,'2012-04-03' union all
select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
select '孙','B','产品2','产品乙组',1,'2012-04-11'
go
declare @str varchar(max)
set @str=''
select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+QUOTENAME(产品组别,'''')+
' then 销售金额 else 0 end)' from report
group by 产品组别
exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组')
--是你的结果有问题还是我的算法错误?不过我按照你的结果分析,不晓得是怎么回事。
/*
销售组 产品甲组个数 产品甲组金额 产品乙组个数 产品乙组金额 总金额
A 1 10000.00 0 0.00 10000.00
B 1 50000.00 2 1.00 50001.00
C 1 30000.00 0 0.00 30000.00
*/--应该这样,楼上作废
我那号被封了,换这个号,你试试下面的语句,我觉得不应该是quotename的问题
declare @str varchar(max)
set @str=''
select @str=@str+','+产品组别+'个数=sum(case when 产品组别='+'''产品组别'''+
' then 1 else 0 end),'+产品组别+'金额=sum(case when 产品组别='+'''产品组别'''+
' then 销售金额 else 0 end)' from report
group by 产品组别
exec('select 销售组'+@str+',sum(销售金额) as 总金额 from report group by 销售组')
declare @str varchar(max)
set @str=''
select @str=@str+','+产品类型+'个数=sum(case when 产品类型='+'''产品类型'''+
' then 1 else 0 end),'+产品类型+'金额=sum(case when 产品类型='+'''产品类型'''+
' then 签约资产 else 0 end)' from 销售情况表
group by 产品类型
exec('select 销售小组'+@str+',sum(签约资产) as 总金额 from 销售情况表 group by 销售小组')
/*
消息 102,级别 15,状态 1,第 1 行
'=' 附近有语法错误。
*/
假设测试数据是这样:
go
if OBJECT_ID('report')is not null
drop table report
go
create table report(
销售员 nchar(10),
销售组 nchar(8),
产品名称 nchar(10),
产品组别 nchar(10),
销售金额 money,
销售日期 date,
)
go
insert report
select '周','A','产品1','产品甲组',10000,'2012-04-01' union all
select '王','B','产品2','产品乙组',0,'2012-04-03' union all
select '赵','B','产品1','产品甲组',50000,'2012-04-10' union all
select '李','C','产品3','产品甲组',30000,'2012-04-09' union all
select '孙','B','产品2','产品乙组',1,'2012-04-11'
set @str='select 销售组'
select @str=@str+',sum(case when 产品组别='''+产品组别+'''
then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
group by 产品组别
set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组'
print @str
exec(@str)
set @str='select 销售组'
select @str=@str+',sum(case when 产品组别='''+产品组别+'''
then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
group by 产品组别
set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组'
print @str
exec(@str)
感谢,测试通过!
再加深一步:如果要将上述查询的结果保存为一个临时的记录集,改如何写?因为有可能需要对这个记录集进行另外条件的查询,比如将某些金额或个数用特定条件汇总输出。
比如用 with a as 将上述查询得到的记录集保存到临时记录集a中,再对a进行条件查询。
set @str='with t as (select 销售组'
select @str=@str+',sum(case when 产品组别='''+产品组别+'''
then 1 else 0 end) '+rtrim(产品组别)+'个数'+',sum(case when 产品组别='''+产品组别+'''
then 销售金额 else 0 end) '+rtrim(产品组别)+''+'金额' from report
group by 产品组别
set @str=@str+', sum(销售金额) as 总金额 from report group by 销售组) select *from t'
print @str
exec(@str)
我要对临时表t进行条件查询输出就在
select * from t
里面改是吧?但我改成
select * from t where 销售组='A'
回报‘销售组’附近有语法错误?