# 如何写这样的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

• 本文已收录于以下专栏：

## 关于ASP.NET中OnClientClick事件Eval函数解析错误的处理

• Top_xin
• 2016年06月12日 10:58
• 431

## 如何编写一个高效的sql语句

• ylqiu1028
• 2017年06月16日 08:38
• 678

## 如何写sql的递归查询语句?

• caobingyi
• 2010年01月21日 10:19
• 1975

## 写高效的SQL语句

SQL优化总结 1，where的条件顺序影响查询速度 WHERE子句中的连接顺序： ORACLE采用自下而上的顺序解析WHERE子句，根据这个原理，表之间的连接必须写在其他WHERE条件之...
• reggergdsg
• 2017年02月19日 17:49
• 622

## Powerbuilder中常用SQL语句实例

• xuejiayue1105
• 2007年11月07日 15:34
• 1949

## 省市县三级联动的SQL语句

• lhwomg
• 2016年11月08日 16:10
• 2967

## 使用with语句来写一个稍微复杂sql语句(经典，转载)

• dxnn520
• 2012年06月18日 11:09
• 3510

## 一个非常好的ORACLE的分页SQL语句

select * from (select my_table.*, rownum as my_rownum from ( select yhbh, yhmc from yysf_tb_yonghxx...
• mxfhhh
• 2005年07月21日 08:52
• 1409

## SQL语句基础模板

• JingbinChow
• 2017年08月07日 00:11
• 248

## mysql的语句分类，查询、子查询及连接查询

• LJFPHP
• 2017年06月03日 11:59
• 351

举报原因： 您举报文章：如何写这样的SQL语句？ 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)