首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

? 请问,怎么自动生成此表 ?

2012-12-17 
??? 请教,如何自动生成此表 ???传入参数diqu,niandu,表T1diqujine1jine2riqiflag北京100502010-01-101北京

??? 请教,如何自动生成此表 ???
传入参数diqu,niandu,

表T1

diqu  jine1  jine2  riqi         flag
北京   100    50     2010-01-10    1
北京   100    30     2010-05-10    1
上海    80    10     2010-01-10    1
上海   200    80     2010-05-10    0
上海    40    20     2010-07-10    1
北京    70    30     2011-01-10    1



如给定diqu参数为全部,niandu参数为2009, 2010, 2011 则统计结果如下:
其中jine1为flag=1的该年度jine1的总和,jine2也相同,1月~12月指此年度该月jine1的合计数,月以riqi判断

diqu  niandu jine1  jine2   1月 2月 3月  4月  5月 6月  7月  8月 9月 10月 11月 12月
全部  2009     0        0    0   0   0   0    0   0   0    0  0   0    0    0
全部  2010    320     110   180  0   0   0  100   0   40   0  0   0    0    0
全部  2011     70      30    70  0   0   0    0   0   0    0  0   0    0    0



如给定diqu参数为北京,niandu参数为2009, 2010, 2011 则统计结果如下:

diqu  niandu jine1  jine2   1月 2月 3月  4月  5月 6月  7月  8月 9月 10月 11月 12月
北京  2009     0        0    0   0   0   0    0   0   0    0  0   0    0    0
北京  2010    200      80   100  0   0   0  100   0   0    0  0   0    0    0
北京  2011     70      30    70  0   0   0    0   0   0    0  0   0    0    0


请问如何根据传入参数,自动生成上表?



[最优解释]
create table #A(diqu varchar(20),jine1 int,jine2 int ,riqi date,flag int)
insert into #A
select '北京',100,50,'2010-01-10',1 union all select
'北京',   100 ,   30  ,'2010-05-10',    1 union all select


'上海',    80 ,   10 ,'2010-01-10',    1 union all select
'上海',   200 ,   80     ,'2010-05-10',    0 union all select
'上海',    40 ,   20     ,'2010-07-10',    1 union all select
'北京',    70  ,  30     ,'2011-01-10',    1

--字符串分割
create function [dbo].[f_Split]  
 (
 @SourceSql nvarchar(max),--源分隔字符串
 @StrSeprate varchar(10)=','--分隔符
 )
 returns @temp table(a nvarchar(max))
 as 
begin
     declare @i int
     set @SourceSql=rtrim(ltrim(@SourceSql))
     set @i=charindex(@StrSeprate,@SourceSql)
     while @i>=1
     begin
         insert @temp values(left(@SourceSql,@i-1))
         set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
         set @i=charindex(@StrSeprate,@SourceSql)
     end
     if @SourceSql<>'\'
        insert @temp values(@SourceSql)
     return 
end
GO
--------------------------------测试
declare @diqu varchar(20)
declare @niandu varchar(50)
set @diqu='全部'
set @niandu='2010,2011,2012';
declare @TB table(diqu varchar(20),jine1 int,jine2 int ,riqi date,flag int)
if @diqu='全部' 
insert into @TB
select '全部' diqu,jine1,jine2,riqi,flag  from #A where YEAR(riqi) in (select * from f_Split(@niandu,',')) 
else
insert into @TB
select diqu,jine1,jine2,riqi,flag  from #A where YEAR(riqi) in (select * from f_Split(@niandu,',')) and diqu in (select * from f_Split(@diqu,','))


select x.diqu,x.nian,x.jine1,x.jine2,isnull([1月],0) as [1月],isnull([2月],0) as [2月],isnull([3月],0) as [3月],isnull([4月],0) as [4月],isnull([5月],0) as [5月],isnull([6月],0) as [6月],
isnull([7月],0) as [7月],isnull([8月],0) as [8月],isnull([9月],0) as [9月],isnull([10月],0) as [10月],isnull([11月],0) as [11月],isnull([12月],0) as [12月]
from (select diqu,YEAR(riqi) nian,SUM(case when flag=1 then jine1 else 0 end) jine1,SUM(case when flag=1 then jine2 else 0 end) jine2 from @TB group by diqu,YEAR(riqi)) as X
inner join (
select *
from (
select diqu,jine1,YEAR(riqi) nian,cast(MONTH(riqi) as varchar(2))+'月' yue
from @TB) as a
pivot(sum(jine1) for yue in ([1月],[2月],[3月],[4月],[5月],[6月],[7月],[8月],[9月],[10月],[11月],[12月])) as B) as Y on x.diqu=y.diqu and x.nian=y.nian


[其他解释]
用 case when拼是否可行?
------其他解决方案--------------------


坐等高手......
[其他解释]
请参考:http://bbs.csdn.net/topics/240002706
[其他解释]
感谢4楼,但提示:
'max' 附近有语法错误, 必须声明变量'@SourceSql','@StrSeprate','@temp'
我用的是SQL server 2000

[其他解释]
 @StrSeprate varchar(10)=','--分隔符
改为:@StrSeprate varchar(10)  --分隔符

2000杯具了 下面的pivot 也用不了 ,写个case when 语句判断吧

热点排行