Storage Optimization
Description
You noticed that your server is running out of free HDD space. You investigated and discovered that most of the space is taken up by the workers_info table, which has the following structure:
- id: the unique worker ID;
- name: the name of the worker;
- date_of_birth: the worker’s date of birth;
- salary: the worker’s salary.
One strange thing about this table is that a lot of its rows contain NULL
values in some of the columns (except for the id
column, which always contains a non-NULL value).
After thinking about this problem, you’ve decided to change the way you store data in workers_info. Instead of keeping the cells with NULL
values in the table, you will only store id
, column_name
, and value
columns. column_name
will contain the name of a column that contains a non-NULL value for each id
. value
will be the value from this row, converted to a string. For dates, use the format YYYY-MM-DD
.
Given the workers_info table, compose a results table that has the following three columns: id
, column_name
, and value
, that contain the workers’ id
s, the column names, and the stringified values, in the format described above. The table should be sorted in ascending order by id
. Rows with the same id
should be sorted by column names in the following order: name
, date_of_birth
, and then salary
.
Example
For the following tables workers_info, where empty cells stand for a NULL
value
id | name | date_of_birth | salary |
---|---|---|---|
1 | Justin Penrose | 1969-03-01 | 3000 |
2 | |||
3 | Robt Claire | ||
10 | 1970-12-12 | ||
11 | 5000 | ||
12 | Yuk Kluge | 4500 |
the output should be
id | column_name | value |
---|---|---|
1 | name | Justin Penrose |
1 | date_of_birth | 1969-03-01 |
1 | salary | 3000 |
3 | name | Robt Claire |
10 | date_of_birth | 1970-12-12 |
11 | salary | 5000 |
12 | name | Yuk Kluge |
12 | salary | 4500 |
- [execution time limit] 10 seconds (mysql)
Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*Please add ; after each select statement*/
CREATE PROCEDURE storageOptimization()
BEGIN
SELECT * FROM (
SELECT id, 'name' AS column_name, name AS value
FROM workers_info WHERE name IS NOT NULL
UNION
SELECT id, 'date_of_birth' AS column_name, date_of_birth AS value
FROM workers_info WHERE date_of_birth IS NOT NULL
UNION
SELECT id, 'salary' AS column_name, salary AS value
FROM workers_info WHERE salary IS NOT NULL
) t
ORDER BY id, CASE column_name
WHEN 'name' THEN 1
WHEN 'date_of_birth' THEN 2
WHEN 'salary' THEN 3 END;
END