Create Bar Charts

October 8, 2000

Create bar charts, even includes X and Y labels!

create proc Hbar
@cmd varchar(255) , /* TSQL SELECT statement 1st column
Character, 2nd column numeric */
@barsize int=100 , /* Maximum size of bar */
@data_label bit=1, /* Label each bar with value 1=yes */
@x_label varchar(25)=null,
@y_label varchar(25)=null,
@title varchar(255)=null, /* Title for chart */
@barchar char(1)='*' /* Character to use for bar */
as

SET NOCOUNT ON

-- Get x & y into table #t1

CREATE TABLE #t1 (x varchar(25),y real)
INSERT INTO #t1 exec (@cmd)

-- Format bars

DECLARE @barsize2 varchar(3) Select
@barsize2=convert(varchar(8),@barsize)
DECLARE @max real,@i varchar(12)
SELECT @max=max(y) from #t1
SELECT @i = str(@barsize/@max,6,6)

CREATE TABLE #t2 (x varchar(25),bar varchar(255),y real)
INSERT INTO #t2 EXEC ("SELECT right(replicate(' ',25)+x,25),
Bar=convert(char("+ @barsize2 +"),
isnull(replicate('"+@barchar+"',convert(int,y*" + @i +")),'')),y
from #t1")

-- Label bars if required

IF @data_label =1
UPDATE #t2 SET bar=bar+' ('+convert(varchar(14),y)+ ')'

-- Print title

DECLARE @line varchar(255) ,@c int
SELECT @c=((@barsize+50)-datalength(@title))/2
SELECT @line = REPLICATE(' ',@c) + @TITLE
PRINT @line
SELECT @line = REPLICATE(' ',@c) + replicate
('=',datalength(@title))
PRINT @line
PRINT ' '
SELECT @line=right(REPLICATE(' ',25)+@x_label,25)
PRINT @line
PRINT ' '

-- print chart

DECLARE hb_cursor INSENSITIVE CURSOR
FOR SELECT x,bar,y
FROM #t2

DECLARE @x varchar(25), @bar varchar(255) ,@y real

OPEN hb_cursor
WHILE 1=1
BEGIN
FETCH NEXT FROM hb_cursor INTO @x ,@bar ,@y
IF @@FETCH_STATUS <> 0
BREAK
EXEC (' PRINT "' + @x + ' | ' + @bar +'"')
END
DEALLOCATE hb_cursor

-- Print y axis

DECLARE @Scale varchar(255) , @y_axis varchar(255)
SELECT @scale = ' +'
SELECT @y_axis = ' 0'

DECLARE @ten int SELECT @ten=@max/(@barsize/10)

DECLARE @ten2 int SELECT @ten2 = @ten

WHILE @ten2 < @max+@ten
BEGIN
SELECT @scale = @scale + '----+----+'
SELECT @y_axis = @y_axis + right ('
'+convert(varchar(5),@ten2),10)
SELECT @ten2=@ten2 + @ten
END
PRINT @scale
PRINT @y_axis
PRINT ' '
SELECT @line = REPLICATE(' ',@c) + @y_label
PRINT @line
PRINT ' '
go

/* TEST DATA */

exec Hbar 'select convert(varchar(5),spid),cpu from
master..sysprocesses where cpu<>0',
@barsize=100,
@data_label=0,
@title='Processes by CPU',
@barchar='#',
@x_label='SPID',
@y_label='CPU'

set nocount on
declare @cmd varchar(255)
select @cmd="
select o.name, size=sum(used * 2)
from sysindexes i, sysobjects o ,syscolumns c
where i.id = o.id
and i.indid in (0, 1, 255)
and c.id = o.id
and o.name not like 'sys%'

GROUP BY o.name,o.id "

exec Hbar @cmd,@barsize=100,@data_label=1,@title='Tables by Size'








The Network for Technology Professionals

Search:

About Internet.com

Legal Notices, Licensing, Permissions, Privacy Policy.
Advertise | Newsletters | E-mail Offers