求sql统计难题
表的格式如下
展览名称 客户名称 日期
展览1 客户A 2008
展览2 客户A 2008
展览1 客户A 2009
展览3 客户A 2010
展览4 客户B 2011
展览5 客户B 2008
展览6 客户B 2008
展览7 客户B 2009
展览8 客户B 2010
展览9 客户B 2011
..... ..... ....
..... ..... ....
现想将它进行统计,统计目标是产看这么多年那些客户有流失过。
希望得到的结果是方式是 每年年份是否有做过,yes 代表有做,no代表没做。。最后总概括 标记是否有"流失过?"
客户名称 2005 2006 2007 2008 2009 2010 2011 流失过?
客户A no no yes yes no yes yes yes
客户B yes yes yes yes yes yes yes no
[解决办法]
select 客户名称, [2005]=max(case when 日期=2005 then 'yes' else 'no' end), [2006]=max(case when 日期=2006 then 'yes' else 'no' end), [2007]=max(case when 日期=2007 then 'yes' else 'no' end), ......from tb group by 客户名称
[解决办法]
declare @sql varchar(8000)set @sql = 'select 客户名称 'select @sql = @sql + ' , max(case 日期 when ''' + 日期 + ''' then ''''yes'''' else ''no'' end) [' + 日期 + ']'from (select distinct 日期 from tb) as aset @sql = @sql + ' from tb group by 客户名称'exec(@sql)
[解决办法]
--测试表 测试数据create table tab_b( 展览名称 varchar(30), 客户名称 varchar(30), 日期 varchar(30))insert into tab_bselect '展览1','客户A','2008' union allselect '展览2','客户A','2008' union allselect '展览1','客户A','2009' union allselect '展览3','客户A','2010' union allselect '展览4','客户B','2011' union allselect '展览5','客户B','2008' union allselect '展览6','客户B','2008' union allselect '展览7','客户B','2009' union allselect '展览8','客户B','2010' union allselect '展览9','客户B','2011'--查询--把以下代码放入一个循环内 动态给变量@year值就行了declare @year varchar(30),@i intselect @year='2010'select @i=count(*) from tab_b where 日期=@yearselect 客户名称,case when @i>0 then 'yes' else 'no'end as 是否流失from tab_b where 日期 = @year
[解决办法]
declare @sql varchar(8000)
set @sql = 'select 客户名称 '
select @sql = @sql + ' , max(case 日期 when ''' + 日期 + ''' then ''''yes'''' else ''no'' end) [' + 日期 + ']'
from (select distinct 日期 from tb) as a
set @sql = @sql + ' from tb group by 客户名称'
exec(@sql)
[解决办法]
create table tb( 展览名称 varchar(30), 客户名称 varchar(30), 日期 varchar(30))insert into tbselect '展览1','客户A','2008' union allselect '展览2','客户A','2008' union allselect '展览1','客户A','2009' union allselect '展览3','客户A','2010' union allselect '展览4','客户B','2011' union allselect '展览5','客户B','2008' union allselect '展览6','客户B','2008' union allselect '展览7','客户B','2009' union allselect '展览8','客户B','2010' union allselect '展览9','客户B','2011'godeclare @sql varchar(8000)set @sql = 'select 客户名称 'select @sql = @sql + ' , max(case 日期 when ''' + 日期 + ''' then ''yes'' else ''no'' end) [' + 日期 + ']'from (select distinct 日期 from tb) as aset @sql = @sql + ' from tb group by 客户名称'exec(@sql) /*客户名称 2008 2009 2010 2011 ------------------------------ ---- ---- ---- ---- 客户A yes yes yes no客户B yes yes yes yes*/drop table tb