日期:2014-05-18  浏览次数:20575 次

求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



------解决方案--------------------
SQL code
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 客户名称

------解决方案--------------------
SQL code
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)

------解决方案--------------------
SQL code

--测试表 测试数据
create table tab_b
(
    展览名称 varchar(30),
    客户名称 varchar(30),
    日期 varchar(30)
)
insert into tab_b
select '展览1','客户A','2008' union all
select '展览2','客户A','2008' union all
select '展览1','客户A','2009' union all
select '展览3','客户A','2010' union all
select '展览4','客户B','2011' union all
select '展览5','客户B','2008' union all
select '展览6','客户B','2008' union all
select '展览7','客户B','2009' union all
select '展览8','客户B','2010' union all
select '展览9','客户B','2011'
--查询--把以下代码放入一个循环内 动态给变量@year值就行了
declare @year varchar(30),@i int
select @year='2010'
select @i=count(*) from tab_b where 日期=@year
select 客户名称,
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)
------解决方案--------------------
SQL code
create table tb
(
    展览名称 varchar(30),
    客户名称 varchar(30),
    日期 varchar(30)
)
insert into tb
select '展览1','客户A','2008' union all
select '展览2','客户A','2008' union all
select '展览1','客户A','2009' union all
select '展览3','客户A','2010' union all
select '展览4','客户B','2011' union all
select '展览5','客户B','2008' union all
select '展览6','客户B','2008' union all
select '展览7','客户B','2009' union all
select '展览8','客户B','2010' union all
select '展览9','客户B','2011'

go
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) 

/*
客户名称                           2008 2009 2010 2011 
------------------------------ ---- ---- ---- ---- 
客户A                            yes  yes  yes  no
客户B                            yes  yes  yes  yes
*/

drop table tb