create table A(序号 int, 品名 nvarchar(10), 数量 int, 日期 datetime) insert A select 1, '产品1', 20, '2006-12-9' union all select 2, '产品1', 10, '2006-12-15' union all select 3, '产品2', 15,'2006-11-23' union all select 4, '产品3', 12,'2006-11-24' union all select 5, '产品4', 10,'2007-01-4' union all select 6, '产品6', 10,'2007-01-8' union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000) set @sql='select 品名, ' select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from ( select 日期=convert(char(7), 日期, 120) from A group by convert(char(7), 日期, 120) )tmp set @sql=@sql+' [大於0的月數]=(select count(distinct convert(char(7), 日期, 120)) from A where 品名=tmp.品名 and 数量>0 group by convert(char(7), 日期, 120)) from A as tmp group by 品名' exec(@sql)--result 品名 2006-11 2006-12 2007-01 大於0的月數 ---------- ----------- ----------- ----------- ----------- 产品1 0 30 0 1 产品2 15 0 0 1 产品3 12 0 0 1 产品4 0 0 10 1 产品6 0 0 25 1
--trycreate table A(序号 int, 品名 nvarchar(10), 数量 int, 日期 datetime) insert A select 1, '产品1', 20, '2006-12-9' union all select 2, '产品1', 10, '2006-12-15' union all select 3, '产品2', 15,'2006-11-23' union all select 3, '产品2', 25,'2006-12-20' union all select 4, '产品3', 12,'2006-11-24' union all select 5, '产品4', 10,'2007-01-4' union all select 6, '产品6', 10,'2007-01-8' union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000) set @sql='select 品名, ' select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from ( select 日期=convert(char(7), 日期, 120) from A group by convert(char(7), 日期, 120) )tmp set @sql=@sql+' [大於0的月數]=( select sum(num) from ( select num=count(distinct convert(char(7), 日期, 120)) from A where 品名=tmp.品名 and 数量>0 group by convert(char(7), 日期, 120) )tmp_num ) from A as tmp group by 品名' exec(@sql)--result 品名 2006-11 2006-12 2007-01 大於0的月數 ---------- ----------- ----------- ----------- ----------- 产品1 0 30 0 1 产品2 15 25 0 2 产品3 12 0 0 1 产品4 0 0 10 1 产品6 0 0 25 1
为什么我引有用到我的例子上就报错了呢? declare @sql varchar(8000) set @sql='select 品名, ' select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 开单日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from ( select 日期=convert(char(7), 开单日期, 120) from tab group by convert(char(7), 开单日期, 120) )tmp set @sql=@sql+' [销售总月數] = (select count(distinct convert(char(7), 开单日期, 120)) from tab where 品名=tmp.品名 and 数量>0 group by convert(char(7), 开单日期, 120)) from tab as tmp group by 品名' exec(@sql) 服务器: 消息 512,级别 16,状态 1,行 1 子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。这语句有点复杂,有点看不懂,介绍一本好书来看看吧
insert A select 1, '产品1', 20, '2006-12-9'
union all select 2, '产品1', 10, '2006-12-15'
union all select 3, '产品2', 15,'2006-11-23'
union all select 4, '产品3', 12,'2006-11-24'
union all select 5, '产品4', 10,'2007-01-4'
union all select 6, '产品6', 10,'2007-01-8'
union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000)
set @sql='select 品名, '
select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
(
select 日期=convert(char(7), 日期, 120)
from A
group by convert(char(7), 日期, 120)
)tmp
set @sql=@sql+' [大於0的月數]=(select count(distinct convert(char(7), 日期, 120)) from A where 品名=tmp.品名 and 数量>0 group by convert(char(7), 日期, 120)) from A as tmp group by 品名'
exec(@sql)--result
品名 2006-11 2006-12 2007-01 大於0的月數
---------- ----------- ----------- ----------- -----------
产品1 0 30 0 1
产品2 15 0 0 1
产品3 12 0 0 1
产品4 0 0 10 1
产品6 0 0 25 1
insert A select 1, '产品1', 20, '2006-12-9'
union all select 2, '产品1', 10, '2006-12-15'
union all select 3, '产品2', 15,'2006-11-23'
union all select 3, '产品2', 25,'2006-12-20'
union all select 4, '产品3', 12,'2006-11-24'
union all select 5, '产品4', 10,'2007-01-4'
union all select 6, '产品6', 10,'2007-01-8'
union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000)
set @sql='select 品名, '
select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
(
select 日期=convert(char(7), 日期, 120)
from A
group by convert(char(7), 日期, 120)
)tmp
set @sql=@sql+' [大於0的月數]=( select sum(num) from
(
select num=count(distinct convert(char(7), 日期, 120))
from A
where 品名=tmp.品名 and 数量>0
group by convert(char(7), 日期, 120)
)tmp_num
) from A as tmp group by 品名'
exec(@sql)--result
品名 2006-11 2006-12 2007-01 大於0的月數
---------- ----------- ----------- ----------- -----------
产品1 0 30 0 1
产品2 15 25 0 2
产品3 12 0 0 1
产品4 0 0 10 1
产品6 0 0 25 1
declare @sql varchar(8000)
set @sql='select 品名, '
select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 开单日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
(
select 日期=convert(char(7), 开单日期, 120)
from tab
group by convert(char(7), 开单日期, 120)
)tmp
set @sql=@sql+' [销售总月數] = (select count(distinct convert(char(7), 开单日期, 120)) from tab where 品名=tmp.品名 and 数量>0 group by convert(char(7), 开单日期, 120)) from tab as tmp group by 品名'
exec(@sql)
服务器: 消息 512,级别 16,状态 1,行 1
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。这语句有点复杂,有点看不懂,介绍一本好书来看看吧