根据“坐标”生成趋势图

数据库环境:SQL SERVER 2008R2

  有一“坐标”表t,表结构如下:

  id           int,

  num       int

  字段id是序号,递增且连续,字段num是数值类型。id可以看成是坐标轴的横轴,num则跟纵轴有关系,

连续的2行记录,如果后一行的num值比前一行的num值大,则是递增趋势,反之,是递减趋势。要实现的效果如下图1:

  实现思路:

  将id=1的“坐标”所在纵轴设定为0,然后遍历后续所有的“坐标”,后面“坐标”的num值比前一个“坐标”的num大的,则纵坐标+1,

否则纵坐标-1。再对整理后的结果集进行行转列,根据纵坐标分组。

1.建表,插入测试数据

CREATE TABLE t(id INT,num INT)
INSERT INTO t VALUES(1,1);
INSERT INTO t VALUES(2,3);
INSERT INTO t VALUES(3,4);
INSERT INTO t VALUES(4,7);
INSERT INTO t VALUES(5,5);
INSERT INTO t VALUES(6,2);
INSERT INTO t VALUES(7,6);
INSERT INTO t VALUES(8,8);
INSERT INTO t VALUES(9,4);
INSERT INTO t VALUES(10,0);
INSERT INTO t VALUES(11,9);
INSERT INTO t VALUES(12,10);
INSERT INTO t VALUES(13,12);
INSERT INTO t VALUES(14,11);
INSERT INTO t VALUES(15,17);
INSERT INTO t VALUES(16,4);
INSERT INTO t VALUES(17,2);
INSERT INTO t VALUES(18,1);

2.遍历所有“坐标”,生成分组依据

WITH x1 ( id, num, gp )
          AS ( SELECT   id ,
                        num ,
                        0 AS gp
               FROM     t x0
               WHERE    id = 1
               UNION ALL
               SELECT   x0.id ,
                        x0.num ,
                        CASE WHEN x0.num > x1.num THEN x1.gp - 1
                             ELSE x1.gp + 1
                        END AS gp
               FROM     t x0 ,
                        x1
               WHERE    x0.id = x1.id + 1
             )

3.行转列实现最终结果集

SELECT  ISNULL(CAST([1] AS VARCHAR(2)), ‘‘) [1] ,
            ISNULL(CAST([2] AS VARCHAR(2)), ‘‘) [2] ,
            ISNULL(CAST([3] AS VARCHAR(2)), ‘‘) [3] ,
            ISNULL(CAST([4] AS VARCHAR(2)), ‘‘) [4] ,
            ISNULL(CAST([5] AS VARCHAR(2)), ‘‘) [5] ,
            ISNULL(CAST([6] AS VARCHAR(2)), ‘‘) [6] ,
            ISNULL(CAST([7] AS VARCHAR(2)), ‘‘) [7] ,
            ISNULL(CAST([8] AS VARCHAR(2)), ‘‘) [8] ,
            ISNULL(CAST([9] AS VARCHAR(2)), ‘‘) [9] ,
            ISNULL(CAST([10] AS VARCHAR(2)), ‘‘) [10] ,
            ISNULL(CAST([11] AS VARCHAR(2)), ‘‘) [11] ,
            ISNULL(CAST([12] AS VARCHAR(2)), ‘‘) [12] ,
            ISNULL(CAST([13] AS VARCHAR(2)), ‘‘) [13] ,
            ISNULL(CAST([14] AS VARCHAR(2)), ‘‘) [14] ,
            ISNULL(CAST([15] AS VARCHAR(2)), ‘‘) [15] ,
            ISNULL(CAST([16] AS VARCHAR(2)), ‘‘) [16] ,
            ISNULL(CAST([17] AS VARCHAR(2)), ‘‘) [17] ,
            ISNULL(CAST([18] AS VARCHAR(2)), ‘‘) [18]
    FROM    ( SELECT    *
              FROM      x1
            ) AS t1 PIVOT( MAX(num) FOR id IN ( [1], [2], [3], [4], [5], [6],
                                                [7], [8], [9], [10], [11],
                                                [12], [13], [14], [15], [16],
                                                [17], [18] ) )AS t2

  如果要实现比较逼真的趋势图,用“/”、“\”替代数值,实现下图2的效果,只需在遍历坐标的时候再做些处理即可。

  实现的SQL脚本:

WITH    x1 ( id, num, cc, gp )
          AS ( SELECT   id ,
                        num ,
                        ‘/‘ AS cc ,
                        0 AS gp
               FROM     t x0
               WHERE    id = 1
               UNION ALL
               SELECT   x0.id ,
                        x0.num ,
                        CASE WHEN x0.num > x1.num THEN ‘/‘
                             ELSE ‘\‘
                        END AS cc ,
                        CASE WHEN x0.num > x1.num THEN x1.gp - 1
                             ELSE x1.gp + 1
                        END AS gp
               FROM     t x0 ,
                        x1
               WHERE    x0.id = x1.id + 1
             )
    SELECT  ISNULL([1], ‘‘) [1] ,
            ISNULL([2], ‘‘) [2] ,
            ISNULL([3], ‘‘) [3] ,
            ISNULL([4], ‘‘) [4] ,
            ISNULL([5], ‘‘) [5] ,
            ISNULL([6], ‘‘) [6] ,
            ISNULL([7], ‘‘) [7] ,
            ISNULL([8], ‘‘) [8] ,
            ISNULL([9], ‘‘) [9] ,
            ISNULL([10], ‘‘) [10] ,
            ISNULL([11], ‘‘) [11] ,
            ISNULL([12], ‘‘) [12] ,
            ISNULL([13], ‘‘) [13] ,
            ISNULL([14], ‘‘) [14] ,
            ISNULL([15], ‘‘) [15] ,
            ISNULL([16], ‘‘) [16] ,
            ISNULL([17], ‘‘) [17] ,
            ISNULL([18], ‘‘) [18]
    FROM    ( SELECT    id ,
                        cc ,
                        gp
              FROM      x1
            ) AS t1 PIVOT( MAX(cc) FOR id IN ( [1], [2], [3], [4], [5], [6],
                                               [7], [8], [9], [10], [11], [12],
                                               [13], [14], [15], [16], [17],
                                               [18] ) )AS t2

时间: 2024-08-05 19:08:51

根据“坐标”生成趋势图的相关文章

.NET 使用 Highcharts生成扇形图 柱形图

1.首先新建一个.NET网站,如图所示: 2.引用所需要的js类库,如下图 highcharts.js可以在网上搜索就可以找到下载了. 3.在Default.aspx页面引用js 4.在 body 下添加一个<div id="container" style="width: 98%; height: 500px; margin: 0 auto"> , 前台代码如下 1 <script type="text/javascript"

Excel应该这么玩——7、我是预言家:绘制趋势图

让我们先看一个场景:你是公司销售部的员工,你手里有公司最近几年的销售额相关的数据,经理希望你预测下个月的销售额.盯着一堆数据,你或许会想到画一张XY坐标图,然后将每个月份的销售额标定为一个坐标.但是下个月的趋势是上升还是下降,值是多少,估计你只能凭感觉在坐标图上打一个点. 读完本文,你就有了很严谨的预测未来趋势的能力,不只是凭感觉哦. 假设存在下面一系列数据,第一行是区间值(例如第几个月),第二行的随着区间变化的值(例如销售额). 选中数据,菜单:插入->图表->散点图->带平滑线和数据

Android 常用效果(各种进度条,酷炫loading动画,火箭升空,撒花以及趋势图)

最近时间比较充裕一些,总结了下几个项目用到的ui效果,在这边共享给大家,也给自己做个记录(后面会有demo贴出). 主要是以下几种ui效果: 进度条多种展示 开源loading动画 火箭升空 撒花效果(仿微信) 气温趋势图 一.进度条 这边主要是有四种进度条展示,具体效果请往下看: 二.开源loading动画 这边有两种动画,来自于网上的开源demo,第一种是市场上app的比较常见动画,第二种是新版58的加载动画,具体效果请往下看: 三.火箭升空 这是在公司的一键清理项目中用到的一个动画,主要是

Android实现天气预报温度/气温折线趋势图

 Android实现天气预报温度/气温折线趋势图 天气预报的APP应用中,难免会遇到绘制天气温度/气温,等关于数据趋势的折线或者曲线图,这类关于气温/温度的折线图,一般会有两条线,一条是高温线,一条是低温线. 我之前介绍了一个Android平台上第三方开源框架的统计图表库MPAndroidChart(文章链接地址:http://blog.csdn.net/zhangphil/article/details/47656521 ),具体使用方法详情请看这篇文章. 现在基于Android平台上的M

android趋势图创建与使用

之前项目需求里有一个需求是要根据每周的天气温度去绘制一个趋势图,这个图不基于XY坐标,就是一个单纯的趋势图,百度后看了一些博客,大体上有了一些思路,下面是整个趋势图的效果图: 最下面的点线图就是要做的效果. 下面贴出趋势图示例代码: package com.example.testxyjar; import utils.XYViewDrawBitmap; import utils.XYViewDrawLine; import utils.XYViewDrawPointer; import uti

用pChart生成雷达图图片

需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存.所以说我必须生成一张带有雷达图的图片第一反应是用百度echars雷达图做动态显示,之后截图.考虑到工作量和效率,放弃.改为pchart 直接生成雷达图图片 然后用imagick拓展贴到背景图上面.由于imagick攻略比较详细,这里不做赘述,而pchart中文文档则比较匮乏,所以简略介绍下. 第一步 在pchart官网下载类库 http://www.pchart.net/download  建议在本地环境调试

WPF实现炫酷趋势图

环境: 系统: Window 7以上: 工具:VS2013及以上. 研发语言及工程: C# WPF 应用程序 效果: ? ? 简介: 不需要调用第三方Dll, 仅仅在WPF中使用贝塞尔曲线,不到500行代码构建自定义的趋势图效果. 原理: WPF中路径Path的Data值为PathGeometry.如: <Path x:Name="PathData1" Stroke="#FFEE4141" StrokeThickness="2"> &

【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 实时数据使用来源API: https://www.btc123.com/kline/klineapi 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦

添加ModelGoon插件Eclipse自动生成UML图

下载ModelGoonjar包 http://download.csdn.net/detail/u011070297/8366021 下载完该jar之后,直接拷贝到Eclipse安装目录下的dropins目录下,重启Eclipse即可  如何使用 安装成功后,file=>new=>other菜单里面会多出一项ModelGoon Diagrams,在自己已有的java工程中新建一个class diagram,用以生成类图.创建完成后你会发现生成了一个.mgc后缀的文件,现在你可以用这个文件创建自