日期:2014-05-18  浏览次数:20510 次

一个数据库的列变行问题
从表1得到下面的结果
表1  
年份     月份     销售量     天数
2001       5             400         4    
2001       6             400         8  
2001       7             400         5  
2002       5             400         10  
2003       2             400         12

得到   <font   color=#ff0033> 每年每个月每天销售数量(表1销售量/天数)   </font>
如2001   年
年份     1月(每天销售量)   2月   3月     4月       5月     6月     7月   8月   9月   10月     11月   12月
2001                                                                   100     50       80    



------解决方案--------------------
create table T1(年份 int, 月份 int, 销售量 int, 天数 int)

insert into T1

select 2001, 5, 400, 4 union all
select 2001, 6, 400, 8 union all
select 2001, 7, 400, 5 union all
select 2002, 5, 400, 10 union all
select 2003, 2, 400, 12


select
年份,
cast(sum(case when 月份=1 then 销售量 else null end)*1.0/max(case when 月份=1 then 天数 else 0 end) as decimal(10,2)) as [1月],
cast(sum(case when 月份=2 then 销售量 else null end)*1.0/max(case when 月份=2 then 天数 else 0 end) as decimal(10,2)) as [2月],
cast(sum(case when 月份=3 then 销售量 else null end)*1.0/max(case when 月份=3 then 天数 else 0 end) as decimal(10,2)) as [3月],
cast(sum(case when 月份=4 then 销售量 else null end)*1.0/max(case when 月份=4 then 天数 else 0 end) as decimal(10,2)) as [4月],
cast(sum(case when 月份=5 then 销售量 else null end)*1.0/max(case when 月份=5 then 天数 else 0 end) as decimal(10,2)) as [5月],
cast(sum(case when 月份=6 then 销售量 else null end)*1.0/max(case when 月份=6 then 天数 else 0 end) as decimal(10,2)) as [6月],
cast(sum(case when 月份=7 then 销售量 else null end)*1.0/max(case when 月份=7 then 天数 else 0 end) as decimal(10,2)) as [7月],
cast(sum(case when 月份=8 then 销售量 else null end)*1.0/max(case when 月份=8 then 天数 else 0 end) as decimal(10,2)) as [8月],
cast(sum(case when 月份=9 then 销售量 else null end)*1.0/max(case when 月份=9 then 天数 else 0 end) as decimal(10,2)) as [9月],
cast(sum(case when 月份=10 then 销售量 else null end)*1.0/max(case when 月份=10 then 天数 else 0 end) as decimal(10,2)) as [10月],
cast(sum(case when 月份=11 then 销售量 else null end)*1.0/max(case when 月份=11 then 天数 else 0 end) as decimal(10,2)) as [11月],
cast(sum(case when 月份=12 then 销售量 else null end)*1.0/max(case when 月份=12 then 天数 else 0 end) as decimal(10,2)) as [12月]
from T1
group by 年份

drop table T1
------解决方案--------------------
--创建测试环境
create table T1(年份 int, 月份 int, 销售量 int, 天数 int)


--追加测试数据
insert into T1
select 2001, 5, 400, 4 union all
select 2001, 6, 400, 8 union all
select 2001, 7, 400, 5 union all
select 2002, 5, 400, 10 union all
select 2003, 2, 400, 12