## CSDN博客

### 如何写这样的SQL语句？

--测试：

create table js (年 int,月 int,降水 float)
insert into js
select 1971,1,34.5 union
select 1971,2,23 union
select 1971,3,56.0 union
select 1972,1,8.5 union
select 1972,2,23 union
select 1972,3,12.0 union
select 1973,3,122.5

--生成几个中间表
select b.*
into #t1
from(
select b.月,降水=max(b.降水)
from js a,js b
where a.降水>=b.降水  and a.月=b.月
group by b.月
) a inner join js b on a.降水=b.降水
order by b.月

select 年,总降水=sum(降水)
into #t2
from js
group by 年

select #t1.*,#t2.总降水
into #t
from #t1 inner join #t2 on #t1.年=#t2.年

--查询
select convert(varchar (10),年) as [年/月]
,[1]=convert(varchar,sum(case 月 when 1 then 降水  end))
,[2]=convert(varchar,sum(case 月 when 2 then 降水  end))
,[3]=convert(varchar,sum(case 月 when 3 then 降水  end))
,[4]=convert(varchar,sum(case 月 when 4 then 降水  end))
,[5]=convert(varchar,sum(case 月 when 5 then 降水  end))
,[6]=convert(varchar,sum(case 月 when 6 then 降水  end))
,[7]=convert(varchar,sum(case 月 when 7 then 降水  end))
,[8]=convert(varchar,sum(case 月 when 8 then 降水  end))
,[9]=convert(varchar,sum(case 月 when 9 then 降水  end))
,[10]=convert(varchar,sum(case 月 when 10 then 降水  end))
,[11]=convert(varchar,sum(case 月 when 11 then 降水  end))
,[12]=convert(varchar,sum(case 月 when 12 then 降水  end))
,合计=convert(varchar,sum(降水))
from js  --这里是表名
group by 年
union all
select '平均' as '年/月',
[1]=convert(varchar,convert(dec(10,1),avg(case 月 when 1 then 降水  end)))
,[2]=convert(varchar,convert(dec(10,1),avg(case 月 when 2 then 降水  end)))
,[3]=convert(varchar,convert(dec(10,1),avg(case 月 when 3 then 降水  end)))
,[4]=convert(varchar,convert(dec(10,1),avg(case 月 when 4 then 降水  end)))
,[5]=convert(varchar,convert(dec(10,1),avg(case 月 when 5 then 降水  end)))
,[6]=convert(varchar,convert(dec(10,1),avg(case 月 when 6 then 降水  end)))
,[7]=convert(varchar,convert(dec(10,1),avg(case 月 when 7 then 降水  end)))
,[8]=convert(varchar,convert(dec(10,1),avg(case 月 when 8 then 降水  end)))
,[9]=convert(varchar,convert(dec(10,1),avg(case 月 when 9 then 降水  end)))
,[10]=convert(varchar,convert(dec(10,1),avg(case 月 when 10 then 降水  end)))
,[11]=convert(varchar,convert(dec(10,1),avg(case 月 when 11 then 降水  end)))
,[12]=convert(varchar,convert(dec(10,1),avg(case 月 when 12 then 降水  end)))
,合计=convert(varchar,(select sum(平均降水) from(
select 月,平均降水=avg(降水) from js group by 月)a))

from js
union all
select '最大值' as '年/月',
[1]=convert(varchar,max(case 月 when 1 then 降水  end))
,[2]=convert(varchar,max(case 月 when 2 then 降水  end))
,[3]=convert(varchar,max(case 月 when 3 then 降水  end))
,[4]=convert(varchar,max(case 月 when 4 then 降水  end))
,[5]=convert(varchar,max(case 月 when 5 then 降水  end))
,[6]=convert(varchar,max(case 月 when 6 then 降水  end))
,[7]=convert(varchar,max(case 月 when 7 then 降水  end))
,[8]=convert(varchar,max(case 月 when 8 then 降水  end))
,[9]=convert(varchar,max(case 月 when 9 then 降水  end))
,[10]=convert(varchar,max(case 月 when 10 then 降水  end))
,[11]=convert(varchar,max(case 月 when 11 then 降水  end))
,[12]=convert(varchar,max(case 月 when 12 then 降水  end))
,合计=convert(varchar,(select sum(最大降水) from(
select 月,最大降水=max(降水) from js group by 月)a))
from js
union all
select '年/月'='出现年份',
[1]=convert(varchar(4),max(case 月 when 1 then 年 end) )
,[2]=convert(varchar(4),max(case 月 when 2 then 年 end) )
,[3]=convert(varchar(4),max(case 月 when 3 then 年 end) )
,[4]=convert(varchar(4),max(case 月 when 4 then 年 end) )
,[5]=convert(varchar(4),max(case 月 when 5 then 年 end) )
,[6]=convert(varchar(4),max(case 月 when 6 then 年 end) )
,[7]=convert(varchar(4),max(case 月 when 7 then 年 end) )
,[8]=convert(varchar(4),max(case 月 when 8 then 年 end) )
,[9]=convert(varchar(4),max(case 月 when 9 then 年 end) )
,[10]=convert(varchar(4),max(case 月 when 10 then 年 end) )
,[11]=convert(varchar(4),max(case 月 when 11 then 年 end) )
,[12]=convert(varchar(4),max(case 月 when 12 then 年 end) )
,合计=convert(varchar,(select  top 1 b.年
from(
select 年=max(b.年),总降水=max(b.总降水)
from #t a,#t b
where a.总降水>=b.总降水  and a.年=b.年
) a inner join #t b on a.总降水=b.总降水))
from #t b

--删除测试表
drop table js ,#t,#t1,#t2

--运行结果：
年/月         1         2           3          4     ..... 合计
1971          34.5    23.5     56      null  .....  113.5
1972           8.5      33        12      null  .....  53.5

0 0