Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions calculate_largest_expensors.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
USE memory.default;

WITH employee_expenses AS (
SELECT
e.employee_id,
concat(e.first_name, ' ', e.last_name) AS employee_name,
e.manager_id,
concat(m.first_name, ' ', m.last_name) AS manager_name,
CAST(SUM(x.unit_price * x.quantity) AS DECIMAL(8, 2)) AS total_expensed_amount
FROM expense x
JOIN employee e
ON x.employee_id = e.employee_id
LEFT JOIN employee m
ON e.manager_id = m.employee_id
GROUP BY
e.employee_id,
e.first_name,
e.last_name,
e.manager_id,
m.first_name,
m.last_name
)

SELECT
employee_id,
employee_name,
manager_id,
manager_name,
total_expensed_amount
FROM employee_expenses
WHERE total_expensed_amount > CAST(1000.00 AS DECIMAL(8, 2))
ORDER BY total_expensed_amount DESC;
22 changes: 22 additions & 0 deletions create_employees.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
USE memory.default;

DROP TABLE IF EXISTS employee;

CREATE TABLE employee (
employee_id TINYINT,
first_name VARCHAR,
last_name VARCHAR,
job_title VARCHAR,
manager_id TINYINT
);

INSERT INTO employee VALUES
(CAST(1 AS TINYINT), 'Ian', 'James', 'CEO', CAST(4 AS TINYINT)),
(CAST(2 AS TINYINT), 'Umberto', 'Torrielli', 'CSO', CAST(1 AS TINYINT)),
(CAST(3 AS TINYINT), 'Alex', 'Jacobson', 'MD EMEA', CAST(2 AS TINYINT)),
(CAST(4 AS TINYINT), 'Darren', 'Poynton', 'CFO', CAST(2 AS TINYINT)),
(CAST(5 AS TINYINT), 'Tim', 'Beard', 'MD APAC', CAST(2 AS TINYINT)),
(CAST(6 AS TINYINT), 'Gemma', 'Dodd', 'COS', CAST(1 AS TINYINT)),
(CAST(7 AS TINYINT), 'Lisa', 'Platten', 'CHR', CAST(6 AS TINYINT)),
(CAST(8 AS TINYINT), 'Stefano', 'Camisaca', 'GM Activation', CAST(2 AS TINYINT)),
(CAST(9 AS TINYINT), 'Andrea', 'Ghibaudi', 'MD NAM', CAST(2 AS TINYINT));
18 changes: 18 additions & 0 deletions create_expenses.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
USE memory.default;

DROP TABLE IF EXISTS expense;

CREATE TABLE expense (
employee_id TINYINT,
unit_price DECIMAL(8, 2),
quantity TINYINT
);

INSERT INTO expense VALUES
(CAST(3 AS TINYINT), CAST(6.50 AS DECIMAL(8, 2)), CAST(14 AS TINYINT)),
(CAST(3 AS TINYINT), CAST(11.00 AS DECIMAL(8, 2)), CAST(20 AS TINYINT)),
(CAST(3 AS TINYINT), CAST(22.00 AS DECIMAL(8, 2)), CAST(18 AS TINYINT)),
(CAST(3 AS TINYINT), CAST(13.00 AS DECIMAL(8, 2)), CAST(75 AS TINYINT)),
(CAST(9 AS TINYINT), CAST(300.00 AS DECIMAL(8, 2)), CAST(1 AS TINYINT)),
(CAST(4 AS TINYINT), CAST(40.00 AS DECIMAL(8, 2)), CAST(9 AS TINYINT)),
(CAST(2 AS TINYINT), CAST(17.50 AS DECIMAL(8, 2)), CAST(4 AS TINYINT));
30 changes: 30 additions & 0 deletions create_invoices.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
USE memory.default;

DROP TABLE IF EXISTS invoice;
DROP TABLE IF EXISTS supplier;

CREATE TABLE supplier (
supplier_id TINYINT,
name VARCHAR
);

CREATE TABLE invoice (
supplier_id TINYINT,
invoice_ammount DECIMAL(8, 2),
due_date DATE
);

INSERT INTO supplier VALUES
(CAST(1 AS TINYINT), 'Catering Plus'),
(CAST(2 AS TINYINT), 'Dave''s Discos'),
(CAST(3 AS TINYINT), 'Entertainment tonight'),
(CAST(4 AS TINYINT), 'Ice Ice Baby'),
(CAST(5 AS TINYINT), 'Party Animals');

INSERT INTO invoice VALUES
(CAST(5 AS TINYINT), CAST(6000.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 3, current_date))),
(CAST(1 AS TINYINT), CAST(2000.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 2, current_date))),
(CAST(1 AS TINYINT), CAST(1500.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 3, current_date))),
(CAST(2 AS TINYINT), CAST(500.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 1, current_date))),
(CAST(3 AS TINYINT), CAST(6000.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 3, current_date))),
(CAST(4 AS TINYINT), CAST(4000.00 AS DECIMAL(8, 2)), last_day_of_month(date_add('month', 6, current_date)));
65 changes: 65 additions & 0 deletions find_manager_cycles.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
USE memory.default;

WITH RECURSIVE manager_walk (
root_employee_id,
next_employee_id,
path,
cycle_start_employee_id,
depth
) AS (
SELECT
employee_id,
manager_id,
ARRAY[employee_id],
CAST(NULL AS TINYINT),
1
FROM employee

UNION ALL

SELECT
mw.root_employee_id,
e.manager_id,
concat(mw.path, ARRAY[mw.next_employee_id]),
CASE
WHEN contains(mw.path, mw.next_employee_id)
THEN mw.next_employee_id
ELSE CAST(NULL AS TINYINT)
END,
mw.depth + 1
FROM manager_walk mw
JOIN employee e
ON mw.next_employee_id = e.employee_id
WHERE mw.cycle_start_employee_id IS NULL
AND mw.next_employee_id IS NOT NULL
AND mw.depth < 10
),

cycle_rows (
cycle_path
) AS (
SELECT
slice(
path,
array_position(path, cycle_start_employee_id),
cardinality(path) - array_position(path, cycle_start_employee_id) + 1
)
FROM manager_walk
WHERE cycle_start_employee_id IS NOT NULL
),

cycle_members (
employee_id
) AS (
SELECT DISTINCT
member_id
FROM cycle_rows
CROSS JOIN UNNEST(
slice(cycle_path, 1, cardinality(cycle_path) - 1)
) AS t(member_id)
)

SELECT
employee_id
FROM cycle_members
ORDER BY employee_id;
82 changes: 82 additions & 0 deletions generate_supplier_payment_plans.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
USE memory.default;

WITH invoice_months AS (
SELECT
supplier_id,
invoice_ammount,
date_diff(
'month',
date_trunc('month', current_date),
date_trunc('month', due_date)
) AS months_to_pay
FROM invoice
),

invoice_payment_rows AS (
SELECT
im.supplier_id,
im.invoice_ammount,
im.months_to_pay,
month_offset,
CAST(
round(im.invoice_ammount / CAST(im.months_to_pay AS DECIMAL(8, 2)), 2)
AS DECIMAL(8, 2)
) AS regular_payment
FROM invoice_months im
CROSS JOIN UNNEST(sequence(CAST(0 AS BIGINT), im.months_to_pay - 1)) AS t(month_offset)
),

invoice_payments AS (
SELECT
supplier_id,
month_offset,
CASE
WHEN month_offset = months_to_pay - 1 THEN
CAST(
invoice_ammount - regular_payment * CAST(months_to_pay - 1 AS DECIMAL(8, 2))
AS DECIMAL(8, 2)
)
ELSE regular_payment
END AS invoice_payment_amount
FROM invoice_payment_rows
),

monthly_supplier_payments AS (
SELECT
supplier_id,
last_day_of_month(date_add('month', month_offset, current_date)) AS payment_date,
CAST(SUM(invoice_payment_amount) AS DECIMAL(8, 2)) AS payment_amount
FROM invoice_payments
GROUP BY supplier_id, month_offset
),

supplier_totals AS (
SELECT
supplier_id,
CAST(SUM(invoice_ammount) AS DECIMAL(8, 2)) AS total_due
FROM invoice
GROUP BY supplier_id
)

SELECT
m.supplier_id,
s.name AS supplier_name,
m.payment_amount,
CAST(
st.total_due
- SUM(m.payment_amount) OVER (
PARTITION BY m.supplier_id
ORDER BY m.payment_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
AS DECIMAL(8, 2)
) AS balance_outstanding,
m.payment_date
FROM monthly_supplier_payments m
JOIN supplier s
ON m.supplier_id = s.supplier_id
JOIN supplier_totals st
ON m.supplier_id = st.supplier_id
ORDER BY
m.supplier_id,
m.payment_date;