码迷,mamicode.com
首页 > 其他好文 > 详细

行转列简单应用

时间:2015-07-19 11:46:11      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

数据库环境:SQL SERVER 2008R2

在SQL群看到这样的需求(截图),和对应的建表语句

技术分享

下面是建表语句和初始化数据

CREATE TABLE T ( 日期 DATE, 数量 NUMERIC(18, 2) )

INSERT  INTO T
VALUES  ( 2015-01-01, 10 ),
        ( 2015-01-02, 20 ),
        ( 2015-02-01, 20 ),
        ( 2015-03-01, 30 ),
        ( 2015-04-01, 40 ),
        ( 2016-01-01, 50 ),
        ( 2016-02-01, 60 )

我简单的解释下这个需求,“月平均”字段之前是行转列的应用,“月平均”是指在该年内,有数据的月份的一个平均值,

“年平均”则是对该年12个月份的汇总的一个平均数。

将上述描述的计算方法简化为公式

月平均=该年有数据的月份总和/有数据的月份数

年平均=该年的数据总和/12

下面贴一下实现的SQL代码

/*比较关键的一步,整理数据,将年月作为一个分组条件求和,
保证年月在整理好的数据集里是唯一的,方便后面统计有数据的
月份数*/
WITH    x0
          AS ( SELECT   YEAR(日期) AS tyear ,
                        MONTH(日期) tmonth ,
                        SUM(数量) AS data
               FROM     dbo.T
               GROUP BY YEAR(日期),MONTH(日期)
             )
    SELECT  tyear AS 年,MAX(CASE tmonth WHEN 1 THEN data END) [1],
    MAX(CASE tmonth WHEN 2 THEN data END) [2],
    MAX(CASE tmonth WHEN 3 THEN data END) [3],
    MAX(CASE tmonth WHEN 4 THEN data END) [4],
    MAX(CASE tmonth WHEN 5 THEN data END) [5],
    MAX(CASE tmonth WHEN 6 THEN data END) [6],
    MAX(CASE tmonth WHEN 7 THEN data END) [7],
    MAX(CASE tmonth WHEN 8 THEN data END) [8],
    MAX(CASE tmonth WHEN 9 THEN data END) [9],
    MAX(CASE tmonth WHEN 10 THEN data END) [10],
    MAX(CASE tmonth WHEN 11 THEN data END) [11],
    MAX(CASE tmonth WHEN 12 THEN data END) [12],
    CONVERT(NUMERIC(18,2),SUM(data)/COUNT(*)) AS 月平均,
    CONVERT(NUMERIC(18,2),SUM(data)/12) AS 年平均--保留2位小数
    FROM    x0 GROUP BY tyear

代码比较好理解,关键步骤是在整理数据阶段,相关说明已在代码里注释,这里不再赘述。

附上结果图

技术分享

(本文完)

 

行转列简单应用

标签:

原文地址:http://www.cnblogs.com/boss-he/p/4658248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!