公司原来使用excel公式实现,现在准备转成sql server+excel,有如下问题:
数据库中有表“日金额”,记录每一天有发生交易的客户金额,格式如下:

另一张表列出客户(该表为动态的,客户可能增减),格式如下:

想做个查询输出到excel中,列出客户在某天的收入合计,格式如下:

客户从C1开始依据年度收入金额额度向右排,比如C1客户是这一年总收入最高的,客户次之,以此类推
客户D1在2014-1-4这一天发生金额198,而2014-1-4这一天所有客户收入合计是610
依照坛子里大师的指点使用如下代码:
--建立测试usp
create proc usp_test
@year int
as
--建立临时表,存储一年日期
if object_id('tempdb..#date') is not null
drop table #date
create table #date(date date)
insert into #date select top 370 dateadd(day, number, convert(date,rtrim(@year)+'/1/1'))
from master..spt_values
where number between 0 and 370
and year(dateadd(day, number, convert(datetime,rtrim(@year)+'/1/1'))) = @year
group by number
--建立动态客户字串,按输入年份的sum(qty)倒序
declare @customer varchar(max)
set @customer =''
select @customer = @customer +',['+客户+']'
from
( select 客户汇总对比.客户,sum(isnull(Source.[金额(美金)],0)) as [金额(美金)]
from 客户汇总对比 left join Source
on 客户汇总对比.客户=Source.客户名称
and year([日期]) = @year
group by 客户汇总对比.客户
) x
order by [金额(美金)] desc
set @customer = stuff(@customer,1,1,'')
--建立动态sql语句
declare @sql varchar(max)
set @sql=''
select @sql = 'select 日期 ,'+@customer +
' from Source as A'+
' pivot (sum([金额(美金)]) for 客户名称 in('+@customer+')) B'
select @sql = 'select x1.[date],total=isnull((select sum([金额(美金)]) from Source where [日期]=x1.[date]),0) ,'+@customer+
' from #date as x1 '+
' left join ('+@sql+') as x2'+
' on x1.[date]=x2.[日期]'+
' order by 1'
--执行语句
exec (@sql)
GO
--查看测试结果
exec usp_test 2014
GO
--删除测试环境
drop proc usp_test
结果如下:

有3个问题:
1. 大量日期重复的情况,如何合并?(如1月2号有4行,想要的结果是每一天只占一行)
2. 表格中大量NULL,如何变为0,请给与详细指导
3. 输出到客户端的时候如何将包括列名的信息整体输出?
感激大师们继续给与指点!小弟初学,所知有限,请再给与帮助,小弟祈求。。。。。。。。
------解决方案--------------------
select @customer = @customer +',ISNULL(['+客户+'],0)'