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

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

    附上结果图

    (本文完)

  • 相关阅读:
    关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)
    在Windows上安装MySQL(免安装ZIP版)
    Linux下解决中文乱码问题
    VMware安装VMware Tools
    (RHEL)Linux下的oracle(11g R2)安装过程
    每天学一点Python
    简单的Datatable转List,Json
    C# 刷票程序
    一些顿悟,和新的开始!
    每天学一点Python(2)
  • 原文地址:https://www.cnblogs.com/boss-he/p/4658248.html
Copyright © 2011-2022 走看看