当前位置: 代码迷 >> Sql Server >> 史上最难SQL语句-仍未完全解决,该如何处理
  详细解决方案

史上最难SQL语句-仍未完全解决,该如何处理

热度:83   发布时间:2016-04-24 10:08:46.0
史上最难SQL语句--仍未完全解决
公司原来使用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)'
  相关解决方案