From 92644bea596bddad55b1beeeb1da5cea3b0a6121 Mon Sep 17 00:00:00 2001 From: PlotnikovAleksey Date: Mon, 29 Mar 2021 01:32:16 +0300 Subject: [PATCH 1/3] added solution for Week3 --- Week3/solutions/hw2_task1.sql | 8 ++++ Week3/solutions/hw2_task10.sql | 83 ++++++++++++++++++++++++++++++++++ Week3/solutions/hw2_task2.sql | 10 ++++ Week3/solutions/hw2_task3.sql | 12 +++++ Week3/solutions/hw2_task4.sql | 19 ++++++++ Week3/solutions/hw2_task5.sql | 14 ++++++ Week3/solutions/hw2_task6.sql | 22 +++++++++ Week3/solutions/hw2_task7.sql | 50 ++++++++++++++++++++ Week3/solutions/hw2_task8.sql | 43 ++++++++++++++++++ Week3/solutions/hw2_task9.sql | 49 ++++++++++++++++++++ 10 files changed, 310 insertions(+) create mode 100644 Week3/solutions/hw2_task1.sql create mode 100644 Week3/solutions/hw2_task10.sql create mode 100644 Week3/solutions/hw2_task2.sql create mode 100644 Week3/solutions/hw2_task3.sql create mode 100644 Week3/solutions/hw2_task4.sql create mode 100644 Week3/solutions/hw2_task5.sql create mode 100644 Week3/solutions/hw2_task6.sql create mode 100644 Week3/solutions/hw2_task7.sql create mode 100644 Week3/solutions/hw2_task8.sql create mode 100644 Week3/solutions/hw2_task9.sql diff --git a/Week3/solutions/hw2_task1.sql b/Week3/solutions/hw2_task1.sql new file mode 100644 index 0000000..b2c2ee6 --- /dev/null +++ b/Week3/solutions/hw2_task1.sql @@ -0,0 +1,8 @@ +select a.title as album_name, + count(*) as cnt + from track t + join album a + on t.album_id = a.album_id + group + by a.album_id +having (avg(t.milliseconds) > 250000); \ No newline at end of file diff --git a/Week3/solutions/hw2_task10.sql b/Week3/solutions/hw2_task10.sql new file mode 100644 index 0000000..4aa89cb --- /dev/null +++ b/Week3/solutions/hw2_task10.sql @@ -0,0 +1,83 @@ +with t1 as ( + select a.album_id as album_id, + a.title as album_name, + mt.name as mt_name, + sum(t.bytes) as size_per_mt, + a.artist_id as artist_id + from album a + join track t + on a.album_id = t.album_id + join media_type mt + on t.media_type_id = mt.media_type_id + group by a.album_id, a.title, mt.name +), + t2 as ( + select t1.album_id as album_id, + t1.artist_id as artist_id, + max(t1.size_per_mt) as max_size + from t1 + group by t1.album_id, t1.artist_id + ), + t3 as ( + select t1.album_id as album_id, + t1.album_name as album_name, + t1.mt_name as mt_name, + t1.artist_id as artist_id + from t2 + join t1 + on (t2.album_id, t2.max_size) = (t1.album_id, t1.size_per_mt) + ), + t4 as ( + select ar.artist_id as artist_id, + ar.name as artist_name, + t3.mt_name as mt_name + from artist ar + left join t3 + on ar.artist_id = t3.artist_id + ), + t5 as ( + select t4.artist_id as artist_id, + t4.artist_name as artist_name, + count(*) as whole_cnt + from t4 + group by t4.artist_id, t4.artist_name + ), + t6 as ( + select t4.artist_id as artist_id, + t4.artist_name as artist_name, + t4.mt_name as mt_name, + count(*) as media_cnt + from t4 + group by t4.artist_id, t4.artist_name, t4.mt_name + ), + t7 as ( + select t6.artist_id as artist_id, + t6.artist_name as artist_name, + max(t6.media_cnt) as media_cnt + from t6 + group by t6.artist_id, t6.artist_name + ), + t8 as ( + select distinct on (t6.mt_name, t6.artist_id) t6.mt_name as mt_name, + t6.artist_id as artist_id, + t6.artist_name as artist_name + from t6 + join t7 + on (t7.artist_id, t7.media_cnt) = (t6.artist_id, t6.media_cnt) + order by t6.mt_name, t6.artist_id + ) +select t8.artist_name as artist_name, + t8.mt_name as media_type_name, + CASE + when (t8.mt_name is null) then 0 + else t7.media_cnt + end as media_cnt, + CASE + when (t8.mt_name is null) then 0 + else t5.whole_cnt + end as whole_cnt +from t8 + join t7 + on t7.artist_id = t8.artist_id + join t5 + on t5.artist_id = t8.artist_id; diff --git a/Week3/solutions/hw2_task2.sql b/Week3/solutions/hw2_task2.sql new file mode 100644 index 0000000..c7c6998 --- /dev/null +++ b/Week3/solutions/hw2_task2.sql @@ -0,0 +1,10 @@ +select g.name as g_name, + mt.name as mt_name, + count(*) as cnt + from track t + join genre g + on g.genre_id = t.genre_id + join media_type mt + on mt.media_type_id = t.media_type_id + group + by (g.genre_id, mt.media_type_id); \ No newline at end of file diff --git a/Week3/solutions/hw2_task3.sql b/Week3/solutions/hw2_task3.sql new file mode 100644 index 0000000..b8f301a --- /dev/null +++ b/Week3/solutions/hw2_task3.sql @@ -0,0 +1,12 @@ +select e1.last_name || ' ' || e1.first_name as emp_full_name, + e1.birth_date as emp_birth_date, + e1.hire_date as epm_hire_date, + e2.last_name || ' ' || e2.first_name as manager_full_name, + e2.birth_date as manager_birth_date, + e2.hire_date as manager_hire_date + from employee e1 + inner + join employee e2 + on e1.reports_to = e2.employee_id + where (e1.birth_date < e2.birth_date) + and (e1.hire_date > e2.hire_date); \ No newline at end of file diff --git a/Week3/solutions/hw2_task4.sql b/Week3/solutions/hw2_task4.sql new file mode 100644 index 0000000..39ab6da --- /dev/null +++ b/Week3/solutions/hw2_task4.sql @@ -0,0 +1,19 @@ +with artists_id_and_count as +( + select a.artist_id as ar_id, + count(*) as cnt + from track t + join album a + on a.album_id = t.album_id + where t.genre_id in ( + select genre_id + from genre + where name in ('Rock', 'Metal') + ) + group by a.artist_id +) +select art.name as artist_name, + c.cnt as qty + from artist art + join artists_id_and_count c + on c.ar_id = art.artist_id; \ No newline at end of file diff --git a/Week3/solutions/hw2_task5.sql b/Week3/solutions/hw2_task5.sql new file mode 100644 index 0000000..9a98df7 --- /dev/null +++ b/Week3/solutions/hw2_task5.sql @@ -0,0 +1,14 @@ +select e.last_name || ' ' || e.first_name as empl_full_name, + count(distinct c.customer_id) as customer_cnt, + count(distinct i.invoice_id) as invoice_cnt, + count(distinct i.billing_address) as addresses_cnt, + sum(i_l.quantity) as tracks_cnt + from customer c + join employee e + on c.support_rep_id = e.employee_id + join invoice i + on c.customer_id = i.customer_id + join invoice_line i_l + on i.invoice_id = i_l.invoice_id + group + by (e.last_name, e.first_name); \ No newline at end of file diff --git a/Week3/solutions/hw2_task6.sql b/Week3/solutions/hw2_task6.sql new file mode 100644 index 0000000..6828353 --- /dev/null +++ b/Week3/solutions/hw2_task6.sql @@ -0,0 +1,22 @@ +select CASE + when (length(c.last_name) - length(REPLACE(lower(c.last_name), 'a', '')) = 0) then 'A' + when (length(c.last_name) - length(REPLACE(lower(c.last_name), 'a', '')) = 1) then 'B' + when (length(c.last_name) - length(REPLACE(lower(c.last_name), 'a', '')) = 2) then 'C' + when (length(c.last_name) - length(REPLACE(lower(c.last_name), 'a', '')) >= 3) then 'D' + end as segment_group, + count(distinct mt.name) as cnt + from customer c + join invoice i + on c.customer_id = i.customer_id + join invoice_line i_l + on i.invoice_id = i_l.invoice_id + join track t + on i_l.track_id = t.track_id + join genre g + on t.genre_id = g.genre_id + join media_type mt + on mt.media_type_id = t.media_type_id + where g.name = 'Metal' + or g.name = 'Heavy Metal' + group + by segment_group; \ No newline at end of file diff --git a/Week3/solutions/hw2_task7.sql b/Week3/solutions/hw2_task7.sql new file mode 100644 index 0000000..91aa551 --- /dev/null +++ b/Week3/solutions/hw2_task7.sql @@ -0,0 +1,50 @@ +with t1 as ( + select g.name as g_name, + c.company as company_name, + sum(i_l.quantity) as tracks_per_comp_and_genre, + t.name as track_name + from customer c + join invoice i + on c.customer_id = i.customer_id + join invoice_line i_l + on i.invoice_id = i_l.invoice_id + join track t + on i_l.track_id = t.track_id + join genre g + on t.genre_id = g.genre_id + where company is not null + group by g.name, c.company, t.name +), t2 as ( + select t1.g_name as g_name, + t1.company_name as company_name, + sum(t1.tracks_per_comp_and_genre) as sum_tracks + from t1 + group by t1.g_name, t1.company_name +), t3 as ( + select t2.g_name as g_name, + max(t2.sum_tracks) as max_per_genre + from t2 + group by t2.g_name +), t4 as ( + select distinct on (t2.g_name) t2.g_name, t2.company_name + from t2 + join t3 + on (t2.g_name, t2.sum_tracks) = (t3.g_name, t3.max_per_genre) + order + by t2.g_name, t2.company_name +), t5 as ( + select t1.g_name, + t1.company_name, + t1.tracks_per_comp_and_genre + from t4 + join t1 + on (t1.g_name, t1.company_name) = (t4.g_name, t4.company_name) +) +select res.company_name, res.track_name + from ( + select distinct on (t1.g_name) t1.g_name, t1.company_name, t1.track_name + from t1 + where (t1.g_name, t1.company_name, t1.tracks_per_comp_and_genre) + in (select * from t5) + order by t1.g_name, t1.track_name + ) as res; \ No newline at end of file diff --git a/Week3/solutions/hw2_task8.sql b/Week3/solutions/hw2_task8.sql new file mode 100644 index 0000000..a69f166 --- /dev/null +++ b/Week3/solutions/hw2_task8.sql @@ -0,0 +1,43 @@ +with t1 as ( + select t.track_id as track_id, + t.name as track_name, + g.name as genre_name, + sum(il.quantity) as purchases_of_track + from track t + join genre g + on t.genre_id = g.genre_id + join invoice_line il + on t.track_id = il.track_id + group by t.track_id, t.name, g.name +), t2 as ( + select t1.genre_name as genre_name, + sum(t1.purchases_of_track) as sum_per_genre + from t1 + group + by t1.genre_name +), t3 as ( + select t1.genre_name as genre_name, + t1.track_id as track_id, + t1.track_name as track_name, + t1.purchases_of_track / t2.sum_per_genre * 100 as popularity, + row_number() over (order by t1.genre_name, t1.track_name) as num + from t1 + join t2 + on t1.genre_name = t2.genre_name + order by t1.genre_name, t1.track_name +), t4 as ( + select cp1.genre_name, + cp1.track_id as track_id, + cp1.track_name as track_name, + sum(cp2.popularity) as gap + from t3 cp1 + join t3 cp2 + on cp1.genre_name = cp2.genre_name and cp1.num >= cp2.num + group by cp1.track_id, cp1.track_name, cp1.genre_name +) +select t4.track_name as track_name, + t3.popularity as popularity + from t4 + join t3 + on t3.track_id = t4.track_id + where t4.gap <= 25 diff --git a/Week3/solutions/hw2_task9.sql b/Week3/solutions/hw2_task9.sql new file mode 100644 index 0000000..74f0e31 --- /dev/null +++ b/Week3/solutions/hw2_task9.sql @@ -0,0 +1,49 @@ +with t1 as ( + select a.album_id as album_id, + a.title as album_title, + t.milliseconds as track_duration, + g.name as genre_name + from album a + join track t + on a.album_id = t.album_id + join genre g + on t.genre_id = g.genre_id +), t2 as ( + select t1.album_id as album_id, + t1.album_title as album_title, + t1.genre_name as genre_name, + sum(t1.track_duration) as duration_per_genre + from t1 + group by t1.album_id, t1.album_title, t1.genre_name +), t3 as ( + select t2.album_id as album_id, + t2.album_title as album_title, + max(t2.duration_per_genre) as max_duration + from t2 + group by t2.album_id, t2.album_title +), t4 as ( + select t3.album_id as album_id, + t3.album_title as album_title, + t2.genre_name as genre_name + from t3 + join t2 + on (t3.album_id, t3.max_duration) = + (t2.album_id, t2.duration_per_genre) +), t5 as ( + select a.album_id as album_id, + a.title as album_title, + sum(il.quantity) as cnt + from album a + join track t + on a.album_id = t.album_id + join invoice_line il + on t.track_id = il.track_id + group by a.album_id, a.title +) +select t4.album_title as album_name, + t4.genre_name as genre_name, + coalesce(t5.cnt, 0) as cnt + from t4 + left + join t5 + on t5.album_id = t4.album_id; From 3d32c98c8ed5867ec7183a51f2683895e5117d78 Mon Sep 17 00:00:00 2001 From: PlotnikovAleksey Date: Mon, 29 Mar 2021 23:55:15 +0300 Subject: [PATCH 2/3] corrections for tasks 5-8 --- Week3/solutions/hw2_task5.sql | 2 +- Week3/solutions/hw2_task6.sql | 3 +-- Week3/solutions/hw2_task7.sql | 2 +- Week3/solutions/hw2_task8.sql | 12 ++++++------ 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Week3/solutions/hw2_task5.sql b/Week3/solutions/hw2_task5.sql index 9a98df7..9af7eb4 100644 --- a/Week3/solutions/hw2_task5.sql +++ b/Week3/solutions/hw2_task5.sql @@ -11,4 +11,4 @@ select e.last_name || ' ' || e.first_name as empl_full_name, join invoice_line i_l on i.invoice_id = i_l.invoice_id group - by (e.last_name, e.first_name); \ No newline at end of file + by e.employee_id; \ No newline at end of file diff --git a/Week3/solutions/hw2_task6.sql b/Week3/solutions/hw2_task6.sql index 6828353..72fa7cf 100644 --- a/Week3/solutions/hw2_task6.sql +++ b/Week3/solutions/hw2_task6.sql @@ -16,7 +16,6 @@ select CASE on t.genre_id = g.genre_id join media_type mt on mt.media_type_id = t.media_type_id - where g.name = 'Metal' - or g.name = 'Heavy Metal' + where lower(g.name) like '%metal%' group by segment_group; \ No newline at end of file diff --git a/Week3/solutions/hw2_task7.sql b/Week3/solutions/hw2_task7.sql index 91aa551..d406f60 100644 --- a/Week3/solutions/hw2_task7.sql +++ b/Week3/solutions/hw2_task7.sql @@ -13,7 +13,7 @@ with t1 as ( join genre g on t.genre_id = g.genre_id where company is not null - group by g.name, c.company, t.name + group by g.name, c.company, t.track_id ), t2 as ( select t1.g_name as g_name, t1.company_name as company_name, diff --git a/Week3/solutions/hw2_task8.sql b/Week3/solutions/hw2_task8.sql index a69f166..8c3a6ff 100644 --- a/Week3/solutions/hw2_task8.sql +++ b/Week3/solutions/hw2_task8.sql @@ -16,11 +16,11 @@ with t1 as ( group by t1.genre_name ), t3 as ( - select t1.genre_name as genre_name, - t1.track_id as track_id, - t1.track_name as track_name, - t1.purchases_of_track / t2.sum_per_genre * 100 as popularity, - row_number() over (order by t1.genre_name, t1.track_name) as num + select t1.genre_name as genre_name, + t1.track_id as track_id, + t1.track_name as track_name, + t1.purchases_of_track / t2.sum_per_genre * 100 as popularity, + row_number() over (partition by t1.genre_name order by t1.genre_name, t1.track_name) as num from t1 join t2 on t1.genre_name = t2.genre_name @@ -40,4 +40,4 @@ select t4.track_name as track_name, from t4 join t3 on t3.track_id = t4.track_id - where t4.gap <= 25 + where t4.gap <= 25; \ No newline at end of file From c267eba5d32bb248393dc62172c1b7765cc5adb7 Mon Sep 17 00:00:00 2001 From: Aleha Date: Sun, 11 Apr 2021 23:48:51 +0300 Subject: [PATCH 3/3] added solutions for week4 --- Week4/solutions/hw4_task1.sql | 13 +++++ Week4/solutions/hw4_task2.sql | 24 ++++++++++ Week4/solutions/hw4_task3.sql | 28 +++++++++++ Week4/solutions/hw4_task4.sql | 76 +++++++++++++++++++++++++++++ Week4/solutions/hw4_task5.sql | 90 +++++++++++++++++++++++++++++++++++ Week4/solutions/hw4_task6.sql | 81 +++++++++++++++++++++++++++++++ 6 files changed, 312 insertions(+) create mode 100644 Week4/solutions/hw4_task1.sql create mode 100644 Week4/solutions/hw4_task2.sql create mode 100644 Week4/solutions/hw4_task3.sql create mode 100644 Week4/solutions/hw4_task4.sql create mode 100644 Week4/solutions/hw4_task5.sql create mode 100644 Week4/solutions/hw4_task6.sql diff --git a/Week4/solutions/hw4_task1.sql b/Week4/solutions/hw4_task1.sql new file mode 100644 index 0000000..fb81361 --- /dev/null +++ b/Week4/solutions/hw4_task1.sql @@ -0,0 +1,13 @@ +select distinct on (art.artist_id, g.name) art.name as artist_name, + g.name as genre_name, + t.name as track_name, + t.milliseconds as track_length + from artist art + join album a + on art.artist_id = a.artist_id + join track t + on a.album_id = t.album_id + join genre g + on t.genre_id = g.genre_id + order + by art.artist_id, g.name, t.milliseconds desc; \ No newline at end of file diff --git a/Week4/solutions/hw4_task2.sql b/Week4/solutions/hw4_task2.sql new file mode 100644 index 0000000..b14626e --- /dev/null +++ b/Week4/solutions/hw4_task2.sql @@ -0,0 +1,24 @@ +with t1 as (select c.company as company_name, + t.name as track_name, + g.name as genre_name, + a.title as album_name, + il.quantity * il.unit_price as price + from customer c + join invoice i + on c.customer_id = i.customer_id + join invoice_line il + on i.invoice_id = il.invoice_id + join track t + on il.track_id = t.track_id + join genre g + on t.genre_id = g.genre_id + join album a + on t.album_id = a.album_id + where c.company is not null +) +select distinct on (t1.company_name) t1.company_name as company_name, + t1.track_name as track_name, + t1.genre_name as genre_name, + t1.album_name as album_name +from t1 +order by t1.company_name, t1.price desc, t1.track_name; diff --git a/Week4/solutions/hw4_task3.sql b/Week4/solutions/hw4_task3.sql new file mode 100644 index 0000000..72fd63e --- /dev/null +++ b/Week4/solutions/hw4_task3.sql @@ -0,0 +1,28 @@ +with t1 as (select distinct on (hire_date) + hire_date as hire_date, + coalesce( + lag(hire_date) over (order by hire_date), + to_timestamp('1998-12-31', 'YYYY-MM-DD') + ) as previous_date + from employee + order by hire_date +), t2 as ( + select t1.hire_date as hire_date, + t1.previous_date as previous_date + from t1 + where t1.hire_date - t1.previous_date > '1 day' +), t3 as ( + select t2.hire_date as hire_date, + t2.previous_date as previous_date, + coalesce( + lead(t2.hire_date) over (order by t2.hire_date), + to_timestamp('2020-01-02', 'YYYY-MM-DD') + ) as next_date + from t2 +) +select coalesce(t_1.previous_date, t_2.hire_date) + interval '1 day' as date_start, + coalesce(t_1.hire_date, t_2.next_date) - interval '1 day' as date_end + from t3 t_1 + full + join t3 t_2 + on t_1.hire_date = t_2.next_date; diff --git a/Week4/solutions/hw4_task4.sql b/Week4/solutions/hw4_task4.sql new file mode 100644 index 0000000..cb5f6bd --- /dev/null +++ b/Week4/solutions/hw4_task4.sql @@ -0,0 +1,76 @@ +with t1 as ( + select pl.playlist_id as pl_id, + pl.name as pl_name, + t.name as track_name, + t.milliseconds as track_duration, + t.unit_price as track_price, + g.name as genre_name, + t.bytes as size + from playlist pl + join playlist_track pt + on pl.playlist_id = pt.playlist_id + join track t + on pt.track_id = t.track_id + join genre g + on g.genre_id = t.genre_id +), longest_track_table as ( + select distinct on (t1.pl_id) t1.pl_id as pl_id, + t1.track_name as longest_track_name + -- ,max(t1.track_duration) over (partition by t1.pl_id + -- order by t1.track_duration desc, t1.size) as longest_track_name + from t1 + order by t1.pl_id, t1.track_duration desc, t1.size +), minimal_price_table as ( + select distinct on (t1.pl_id) t1.pl_id as pl_id, + t1.track_name as track_name + -- ,min(t1.track_price) over (partition by t1.pl_id + -- order by t1.track_price, t1.size) as minimal_price_track + from t1 + order by t1.pl_id, t1.track_price, t1.size +), t2 as ( + select t1.pl_id as pl_id, + t1.genre_name as genre_name, + count(*) as tracks_per_genre + from t1 + group by t1.pl_id, t1.genre_name + order by t1.pl_id, t1.genre_name +), genre_table as ( + select distinct on (t2.pl_id) t2.pl_id as pl_id, + t2.genre_name as genre_name + from t2 + order by t2.pl_id, t2.tracks_per_genre desc +) +select distinct on (t1.pl_id) t1.pl_name as playlist_name, + longest_track_table.longest_track_name as longest_track_name, + minimal_price_table.track_name as minimal_price_track, + genre_table.genre_name as playlist_genre_name + from t1 + join longest_track_table + on t1.pl_id = longest_track_table.pl_id + join minimal_price_table + on t1.pl_id = minimal_price_table.pl_id + join genre_table + on t1.pl_id = genre_table.pl_id + order + by t1.pl_id; + +with recursive Empl(emp_id, name_path, title_path, lvl) as +( + select employee_id as emp_id, + cast(last_name || ' ' || first_name as text) as name_path, + cast(title as text) as title_path, + 1 as lvl + from employee + where reports_to is null + + union all + + select e.employee_id as emp_id, + e.last_name || ' ' || e.first_name || '->' || prev.name_path as name_path, + e.title || '->' || prev.title_path, + prev.lvl + 1 as lvl + from employee e + join Empl prev + on e.reports_to = prev.emp_id +) +select * from Empl; \ No newline at end of file diff --git a/Week4/solutions/hw4_task5.sql b/Week4/solutions/hw4_task5.sql new file mode 100644 index 0000000..2f45a9e --- /dev/null +++ b/Week4/solutions/hw4_task5.sql @@ -0,0 +1,90 @@ +with recursive Empl(emp_id, id_path, emp_name, lvl) as +( + select employee_id as emp_id, + cast(employee_id as text) as id_path, + cast(last_name || ' ' || first_name as text) as emp_name, + 1 as lvl + from employee + where reports_to is null + + union all + + select e.employee_id as emp_id, + e.employee_id || '->' || prev.id_path as id_path, + cast(last_name || ' ' || first_name as text) as emp_name, + prev.lvl + 1 as lvl + from employee e + join Empl prev + on e.reports_to = prev.emp_id +), t1 as ( + select e1.emp_id as master_id, + e2.emp_id as slave_id, + e1.emp_name as master_name, + e2.emp_name as slave_name + from Empl e1 + join Empl e2 + on e1.lvl <= e2.lvl + where strpos(e2.id_path, e1.id_path) != 0 +), t2 as ( + select t1.master_id as employee_id, + t1.master_name as employee_name, + il.quantity as amount_of_singletrack, + g.name as genre_name, + t.unit_price as price_per_track + from t1 + join customer c + on t1.slave_id = c.support_rep_id + join invoice i + on c.customer_id = i.customer_id + join invoice_line il + on i.invoice_id = il.invoice_id + join track t + on t.track_id = il.track_id + join genre g + on t.genre_id = g.genre_id +), count_tracks_table as ( + select t2.employee_id as employee_id, + sum(t2.amount_of_singletrack) as tracks_count + from t2 + group by t2.employee_id +), t3 as ( + select t2.employee_id as employee_id, + t2.genre_name as genre_name, + sum(t2.amount_of_singletrack) as tracks_per_genre + from t2 + group by t2.employee_id, t2.genre_name +), most_popular_genre_table as ( + select distinct on (t3.employee_id) t3.employee_id as employee_id, + t3.genre_name as genre_name + from t3 + order by t3.employee_id, t3.tracks_per_genre desc +), t4 as ( + select t2.employee_id as employee_id, + min(t2.price_per_track) as min_price + from t2 + group by t2.employee_id +), tracks_minimal_price_table as ( + select t2.employee_id as employee_id, + sum(t2.amount_of_singletrack) as tracks_minimal_price + from t2 + join t4 + on (t2.employee_id, t2.price_per_track) = (t4.employee_id, t4.min_price) + group by t2.employee_id +) +select distinct on (t1.master_id) t1.master_name as employee_name, + coalesce(r1.tracks_count, 0) as tracks_count, + r2.genre_name as most_popular_genre, + coalesce(r3.tracks_minimal_price, 0) as tracks_minimal_price + from t1 + left + join count_tracks_table r1 + on r1.employee_id = t1.master_id + left + join most_popular_genre_table r2 + on r2.employee_id = t1.master_id + left + join tracks_minimal_price_table r3 + on r3.employee_id = t1.master_id + order + by t1.master_id + diff --git a/Week4/solutions/hw4_task6.sql b/Week4/solutions/hw4_task6.sql new file mode 100644 index 0000000..2746807 --- /dev/null +++ b/Week4/solutions/hw4_task6.sql @@ -0,0 +1,81 @@ +with t1 as ( + select g.genre_id as g_id, + g.name as g_name, + t.track_id as track_id, + t.name as track_name, + i.invoice_id as i_id, + il.quantity * il.unit_price as spent_for_track, + il.quantity as quantity, + c.company as company_name + from genre g + join track t + on g.genre_id = t.genre_id + join invoice_line il + on t.track_id = il.track_id + join invoice i + on il.invoice_id = i.invoice_id + join customer c + on i.customer_id = c.customer_id +), t2 as ( + select t1.g_name as g_name, + t1.track_id as track_id, + t1.track_name as track_name, + count(distinct t1.i_id) as invoices_per_track + from t1 + group by t1.g_name, t1.track_id, t1.track_name +), most_popular_tracks as ( + select t2.g_name as g_name, + t2.track_id as track_id, + t2.track_name as track_name + from t2 + where (t2.g_name, t2.invoices_per_track) in ( + select t2.g_name, max(t2.invoices_per_track) + from t2 + group by t2.g_name + ) +), overall_pay_table as ( + select t1.track_id as track_id, + t1.track_name as track_name, + t1.g_name as g_name, + sum(t1.spent_for_track) as overall_pay + from most_popular_tracks + join t1 + on (t1.track_id, t1.g_name) = (most_popular_tracks.track_id, most_popular_tracks.g_name) + group by t1.track_id, t1.track_name, t1.g_name +), track_count_table as ( + select t1.g_name as g_name, + sum(t1.quantity) as track_count + from t1 + group by t1.g_name +), t3 as ( + select t1.track_id as track_id, + t1.company_name as company_name, + sum(t1.quantity) as tracks_per_company + from t1 + join overall_pay_table + on t1.track_id = overall_pay_table.track_id + where t1.company_name is not null + group by t1.company_name, t1.track_id +), company_name_table as ( + select distinct on (t3.track_id) t3.track_id as track_id, + t3.company_name as company_name + from t3 + where (t3.track_id, t3.tracks_per_company) in ( + select t3.track_id, max(t3.tracks_per_company) + from t3 + group by t3.track_id + ) + order by t3.track_id, t3.company_name +) +select opt.track_name as track_name, + opt.g_name as genre_name, + opt.overall_pay as overall_pay, + tct.track_count as track_count, + cnt.company_name as company_name + from overall_pay_table opt + join track_count_table tct + on opt.g_name = tct.g_name + left + join company_name_table cnt + on cnt.track_id = opt.track_id +