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

добавлено: 29 ноя 14
понравилось:0
просмотров: 6467
комментов: 6

теги:

Автор: 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

Комментарии


  • Круто!

  • да это просто офигеть

  • Спасибо, возьму на заметку. Я так понял это просо графическое представление таблицы с помощью типа geometry (начиная с 2008) и визуализатор студии?
    Я в последнее время делаю dashboard'ы через SSRS (можно экспресс версия) и авто-обновляемые отчеты. создал отчет, кинул 4-6 датасетов на графики, поставил авто-обновление, например раз в 15 мин. и открыл отчет на втором мониторе. удобно наглядно.

  • Конечно, это наверное худший из возможных визуализаторов, не считая text mode.
    Зато и самый доступный. ;)

  • Забавно.
    А 3D можно? :)

  • Когнити?вный диссона?нс - я сейчас в нем. Спасибо за расширение сознания.



Необходимо войти на сайт, чтобы оставлять комментарии