## Unanswered: Fun with SQL(Vertical graph)

It may be easy to show the result by chart, like this.

Code:
```------------------------------ Commands Entered ------------------------------
WITH
source_data(dx , dy) AS (
SELECT edlevel
, COUNT(*)
FROM employee
GROUP BY
edlevel
)
SELECT dx  AS "edlevel(x)"
, dy  AS "nbr of emp(y)"
, LEFT('====================' , dy)
AS "----+----10---+----20"
FROM source_data
;
------------------------------------------------------------------------------

edlevel(x) nbr of emp(y) ----+----10---+----20
---------- ------------- ---------------------
12             2 ==
14             5 =====
15             2 ==
16            12 ============
17             5 =====
18             4 ====
19             1 =
20             1 =

8 record(s) selected.```

You can find other examples in Graeme Birchall's "DB2 SQL Cookbook" under the title "Making Charts Using SQL".
DB2 SQL Cookbook

Here are another charts(Vertical graph).

Example (1a):
Code:
```------------------------------ Commands Entered ------------------------------
WITH
source_data(dx , dy) AS (
SELECT edlevel
, COUNT(*)
FROM employee
GROUP BY
edlevel
)
, vertical_axis(y) AS (
VALUES -1
UNION ALL
SELECT y + 1
FROM  vertical_axis
WHERE y < (SELECT MAX(dy) + 5
FROM source_data)
AND y < 100000
)
SELECT
CASE
WHEN y = -1 THEN
'edlevel |        5        10        15        20        25'
WHEN y = 0 THEN
'--------+--------*---------*---------*---------*---------*'
WHEN MOD(y , 5) = 0 THEN
LPAD( VARCHAR(y) || ' -' , 9 )
ELSE '        |'
END
||
XMLCAST(
XMLGROUP(
COALESCE( LPAD('| ' , (dx - lag_dx) * 2) , '' ) AS xx
ORDER BY dx
)
AS VARCHAR(60)
)
AS "Vertical bar graph (x:edlevel, y:count of employee)"
FROM
(SELECT dx , y
, LAG(dx , 1 , 0)
OVER(PARTITION BY y
ORDER BY dx) lag_dx
FROM vertical_axis AS v
LEFT OUTER JOIN
source_data   AS s
ON  v.y BETWEEN 1 AND s.dy
)
GROUP BY
y
ORDER BY
y DESC
;
------------------------------------------------------------------------------

Vertical bar graph (x:edlevel, y:count of employee)
----------------------------------------------------------------------------------------------------------------------
|
|
15 -
|
|
|                              |
|                              |
10 -                              |
|                              |
|                              |
|                              |
|                              |
5 -                          |   | |
|                          |   | | |
|                          |   | | |
|                      |   | | | | |
|                      |   | | | | | | |
--------+--------*---------*---------*---------*---------*
edlevel |        5        10        15        20        25

19 record(s) selected.```

If horizontal axis(x) is not numeric...

Example (2):
Code:
```------------------------------ Commands Entered ------------------------------
WITH
source_data(dx , dy) AS (
SELECT workdept
, DEC( AVG(salary) , 9 , 0 )
FROM employee
GROUP BY
workdept
)
, vertical_axis(y) AS (
VALUES -2
UNION ALL
SELECT y + 1
FROM  vertical_axis
WHERE y < (SELECT MAX(dy) / 5000 + 3
FROM source_data)
AND y < 100000
)
SELECT CASE
WHEN y <= 0 THEN
SUBSTR( 'avg. salary|department |-----------+' , 25 + y * 12 , 12 )
WHEN MOD(y , 5) = 0 THEN
LPAD( VARCHAR(y * 5000) || ' -' , 12 )
ELSE '           |'
END
||
XMLCAST(
XMLGROUP(
CASE y
WHEN -2 THEN
LPAD( VARCHAR(INT(dy)) || '|' , 6 )
WHEN -1 THEN
' ' || dx || ' |'
WHEN  0 THEN
'-----+'
ELSE
COALESCE( LPAD( '|   ' , (x - lag_x) * 6 ) , '' )
END  AS xx
ORDER BY x )
AS VARCHAR(60)
)
AS "Vertical bar graph (x:department, y:average salary)"
FROM
(SELECT dx , dy , x , y
, LAG(x , 1 , 0)
OVER(PARTITION BY y
ORDER BY x) lag_x
FROM vertical_axis
LEFT OUTER JOIN
(SELECT dx , dy
, ROW_NUMBER() OVER(ORDER BY dx) AS x
FROM  source_data
)
ON  y < (dy + 2500) / 5000
)
GROUP BY
y
ORDER BY
y DESC
;
------------------------------------------------------------------------------

Vertical bar graph (x:department, y:average salary)
------------------------------------------------------------------------
|
|
100000 -
|        |
|  |     |
|  |     |
|  |     |     |                 |
75000 -  |     |     |                 |
|  |     |     |                 |
|  |     |     |                 |
|  |     |     |                 |
|  |     |     |     |     |     |           |
50000 -  |     |     |     |     |     |           |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
25000 -  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
|  |     |     |     |     |     |     |     |
-----------+-----+-----+-----+-----+-----+-----+-----+-----+
department | A00 | B01 | C01 | D11 | D21 | E01 | E11 | E21 |
avg. salary|89500|94250|80156|56900|53486|80175|46998|53827|

25 record(s) selected.```