zoukankan      html  css  js  c++  java
  • 行转列简单应用

    数据库环境: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

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

    附上结果图

    (本文完)

  • 相关阅读:
    June. 26th 2018, Week 26th. Tuesday
    June. 25th 2018, Week 26th. Monday
    June. 24th 2018, Week 26th. Sunday
    June. 23rd 2018, Week 25th. Saturday
    June. 22 2018, Week 25th. Friday
    June. 21 2018, Week 25th. Thursday
    June. 20 2018, Week 25th. Wednesday
    【2018.10.11 C与C++基础】C Preprocessor的功能及缺陷(草稿)
    June.19 2018, Week 25th Tuesday
    June 18. 2018, Week 25th. Monday
  • 原文地址:https://www.cnblogs.com/boss-he/p/4658248.html
Copyright © 2011-2022 走看看