首页 > 根据“坐标”生成趋势图

根据“坐标”生成趋势图

数据库环境:SQL SERVER 2008R2

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

  id           int,

  num       int

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

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

图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);
View Code

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

WITH x1 ( id, num, gp )AS ( SELECT   id ,num ,0 AS gpFROM     t x0WHERE    id = 1UNION ALLSELECT   x0.id ,x0.num ,CASE WHEN x0.num > x1.num THEN x1.gp - 1ELSE x1.gp + 1END AS gpFROM     t x0 ,x1WHERE    x0.id = x1.id + 1)
View Code

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
View Code

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

  实现的SQL脚本:

WITH    x1 ( id, num, cc, gp )AS ( SELECT   id ,num ,'/' AS cc ,0 AS gpFROM     t x0WHERE    id = 1UNION ALLSELECT   x0.id ,x0.num ,CASE WHEN x0.num > x1.num THEN '/'ELSE ''END AS cc ,CASE WHEN x0.num > x1.num THEN x1.gp - 1ELSE x1.gp + 1END AS gpFROM     t x0 ,x1WHERE    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 ,gpFROM      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
View Code

 

转载于:https://www.cnblogs.com/boss-he/p/4758151.html

更多相关:

  • /*判断为空*/ private isNull=data=> (data == null || (data.toString().replace(/ | /g, "") === ""));//测试---------------------------------------- isNull(undefined);//true i...

  •     最近一直在学习三层架构,前些天同样也写了一篇同样的博客,今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。     先将实现三层架构的UML图给大家,帮助大家更好的理解三层。               1. UI作用 (1) 向用户展示特定业务数据 (2) 采集用户的输入信息和操作 Publ...

  •  经常看见MOP上有人贴那种动态的图片,就是把一个字符串作为参数传给一个动态网页,就会生成一个带有这个字符串的图片,这个叫做文字水印。像什么原来的熊猫系列,还有后来的大树和金条,都挺有意思。这东西看着挺好玩的,想做个玩玩。查了查资料,发现用.net来做这个是很容易的,就用Asp.net写了一个非常简单的。全部的代码如下: <%@...

  • 那天去了达内,试听了2个小时的课,刚好讲的他们的当当网项目,讲hibernate表关系映射这段来了,不过也够呛,投影仪看的眼睛点都不舒服,当时讲的也没认真听,听了个大概,就记住那个老师一句话了,说是有经验的人用的,一般人不告诉,就是说这个join fetch 用法,回来查了一下,用起来比较爽,今晚突然来了兴致,小记一下。 join f...

  •           这两天在和斌做后台中的报表,暂定使用水晶报表,目前还只是处于对水晶报表的初级应用阶段,也就是知道如何 汇个总、写个函数、传个参数。           问题总是层出不穷,在最后整合报表,进行报表显示测试的时候,发现每次更新数据显示(除第一次)时都会蹦出一个“登录数据库的信息提示界面”很是苦闷,并且这肯�...

  •  1 2 3   4    Y 5    c:adFile 6    

  • ---修改---create proc p_update ( @ID int, @Name varchar(50), @Age varchar(50), @Sex varchar(20), @StatId int )asbeginupdate Stu set Name=@Name,Age=@Age,Sex=@Sex,StatId=@S...

  • 场景:查询人员指定年月工作量信息 USE [Test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[GetWorkLoadMain] @year int, @month int, @UserId varchar(50) as...