根据“坐标”生成趋势图
生活随笔
收集整理的這篇文章主要介紹了
根据“坐标”生成趋势图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫環境: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);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 t2View 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 t2View Code
?
轉載于:https://www.cnblogs.com/boss-he/p/4758151.html
總結
以上是生活随笔為你收集整理的根据“坐标”生成趋势图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和天下现在多少钱一包?
- 下一篇: 微信网名男符号