Hone logo
Hone
Problems

Reformat Department Table

You're working with a database that stores department information in a "wide" format, where each department's attributes (like ID, name, manager, etc.) are in separate columns. This format can be cumbersome for analysis and reporting. Your task is to transform this data into a "long" format, where each row represents a single department attribute, making it easier to query and aggregate.

Problem Description

You are given a table named Department with the following columns:

  • id: The unique identifier for the department.
  • name: The name of the department.
  • manager: The name of the department's manager.
  • employee: The name of an employee within the department.

Your goal is to reformat this table into a "long" format. For each department, you should create a separate row for each of its attributes (name, manager, employee). The output table should have three columns:

  • id: The department's unique identifier.
  • key: The name of the attribute (e.g., "name", "manager", "employee").
  • value: The corresponding value of that attribute.

Requirements:

  1. Each original department record should result in three new records in the output.
  2. The id column should be preserved for each re-formatted record.
  3. The key column should hold the name of the attribute from the original table.
  4. The value column should hold the data associated with that attribute.

Expected Behavior:

If a department has an ID of 1, a name of "Sales", a manager of "Alice", and an employee of "Bob", the output for this department should be:

  • (1, "name", "Sales")
  • (1, "manager", "Alice")
  • (1, "employee", "Bob")

Edge Cases:

  • Empty input table: If the Department table is empty, the output should also be empty.

Examples

Example 1:

Input Department Table:
+----+--------+---------+----------+
| id | name   | manager | employee |
+----+--------+---------+----------+
| 1  | Sales  | Alice   | Bob      |
| 2  | IT     | Charlie | David    |
+----+--------+---------+----------+
Output Table:
+----+---------+--------+
| id | key     | value  |
+----+---------+--------+
| 1  | name    | Sales  |
| 1  | manager | Alice  |
| 1  | employee| Bob    |
| 2  | name    | IT     |
| 2  | manager | Charlie|
| 2  | employee| David  |
+----+---------+--------+

Explanation: The first department with id 1 is broken down into three rows, one for "name", one for "manager", and one for "employee". The same process is applied to the second department with id 2.

Example 2:

Input Department Table:
+----+--------+---------+----------+
| id | name   | manager | employee |
+----+--------+---------+----------+
| 10 | HR     | Eve     | Frank    |
+----+--------+---------+----------+
Output Table:
+----+---------+--------+
| id | key     | value  |
+----+---------+--------+
| 10 | name    | HR     |
| 10 | manager | Eve    |
| 10 | employee| Frank  |
+----+---------+--------+

Explanation: A single department record is transformed into three records, preserving the id.

Example 3: Empty Table

Input Department Table:
+----+--------+---------+----------+
| id | name   | manager | employee |
+----+--------+---------+----------+
(empty table)
Output Table:
+----+---------+--------+
| id | key     | value  |
+----+---------+--------+
(empty table)

Explanation: An empty input table results in an empty output table.

Constraints

  • The id column is an integer.
  • The name, manager, and employee columns are strings.
  • The input table will contain at most 1000 rows.
  • The length of each string value in name, manager, and employee will be at most 50 characters.
  • The solution should be efficient enough to process the given constraints within reasonable time limits.

Notes

This type of transformation is often referred to as "unpivoting" or "melting" data. Consider how you can iterate through the columns of each row and create new rows based on the column names and their values. You might need to use a technique that effectively duplicates each row multiple times, once for each attribute you want to transform.

Loading editor...
plaintext