19.1.23

Рисуем графики в SQL Server Management Studio

http://www.sql.ru/blogs/decolores/1885

добавлено: 29 ноя 14

Автор: DeColo®es

Отображение каких-либо данных в виде графиков - это часто понятнее и нагляднее, чем таблицы.
Для того, чтобы представить какие-либо данные в виде того или иного графика существуют множество инструментов, начиная простого и мощного Excel, который почти всегда под рукой. 
Но что если Excel не установлен или не доступен?

И даже если установлен - часто разработчик или администратор базы данных имеет некий набор скриптов, которые позволяют быстро оценить текущее состояние системы и создавать отдельный dashboard в Excel или где-то еще не хочется.
В общем - если очень хочется, то графики можно рисовать и в SSMS.



Допустим, есть некие процессы, прогресс выполнения которых хочется отслеживать.
Для выполнения примера ниже нужна база данных в режиме совместимости 110.
Можно выполнять и на SQL2008 и/или режиме совместимости 100, но тогда придется отказаться от функции BufferWithCurves() - линии графиков будут тонкими.


declare @issue table(

        id int primary key,

        name varchar(800) not null

)

 

-- Issues to monitor

insert into @issue(name, id)

values('Hang one', 0), ('Fast', 1), ('Normal', 2), ('Slow', 10), ('Strange', 12)

 

declare @issuedata table(

        issue_id int not null,

        date_time datetime not null,

        total int not null,

        done int not null

        )

 

-- There can be any dates and values

insert into @issuedata([issue_id], [date_time], [total], [done]) values

(0,  '2014-01-01', 100, 50), (0,  '2014-01-04', 100,  50), (0,  '2014-01-07', 100, 50),  (0,  '2014-11-10', 100, 50),

(1,  '2014-01-01', 300,  0), (1,  '2014-01-04', 300,  50), (1,  '2014-01-07', 300, 300), (1,  '2014-11-10', 300, 300),

(2,  '2014-01-01', 300,  0), (2,  '2014-03-01', 300,  50), (2,  '2014-09-01', 300, 200), (2,  '2014-11-10', 300, 300),

(10, '2014-01-01', 300,  0), (10, '2014-03-01', 300,  10), (10, '2014-09-01', 300,  60), (10, '2014-11-10', 300,  80),

(12, '2014-01-01', 300, 50), (12, '2014-03-01', 300, 330), (12, '2014-09-01', 300, 280), (12, '2014-11-10 08:00', 300, 150)

 

declare @points table(

        issue_id int not null,

        date_time datetime not null,

        compl money not null

        primary key(issue_id, date_time)

)

 

insert into @points(

        [issue_id],

        [date_time],

        [compl]

)

select

        sd.[issue_id],

        sd.[date_time],

        100*(convert(money, sd.[done])/sd.[total]) as compl

from @issuedata as sd

 

declare

        @min_dt datetime,

        @max_dt datetime

 

-- Calculate time boundaries to scale spatial results graph

select

        @min_dt = min( p.[date_time] ),

        @max_dt = max( p.[date_time] )

from @points p

 

declare @graph table(

               name varchar(800) not null,

               line geometry null

)

 

-- Prepare the border for the graph (with 3:1 ratio)

insert into @graph values('border', geometry::STLineFromText('LINESTRING (0 0, 300 0, 300 100, 0 100, 0 0)', 0))

 

-- Go through issues

declare C cursor local fast_forward for

        select

               id,

               name

        from @issue as i

       

open C

 

declare

        @issue_id int,

        @name varchar(800),

        @line geometry,

        -- Ratio for X axis

        @ratio money = datediff(mi, @min_dt, @max_dt)/300.

       

while 1=1

begin

        fetch next from C into @issue_id, @name

        if @@fetch_status <> 0 break;

 

        -- Aggregate all points and convert them into a line geometry oinstance

        set @line = geometry::STLineFromText('LINESTRING ('+substring(convert(varchar(max), (

               select

                       ', ' + convert(varchar(20), datediff(mi, @min_dt, p.[date_time])/@ratio) + ' ' + convert(varchar(20), p.compl)

               from @points p

               where p.[issue_id] = @issue_id

               order by p.[date_time]

               for xml path('')

               )), 3, 2000000000)+')', 0);

              

        insert into @graph(

               [name],

               [line]

        )

        values(

               @name,

               -- Extend lines for better visualization

               @line.BufferWithCurves(1)

        )

end

 

-- Return data and enjoy

select *

from @graph

Комментариев нет:

Отправить комментарий