Аналіз бази даних музичного магазину Chinook за допомогою SQL

У цій статті буде проаналізовано базу даних chinook за допомогою SQL.

pic

фото з unsplash.com

Ця база даних містить дані про продукти музичного магазину (плейлисти, треки, альбоми, жанри та артисти), продажі, а також дані про клієнтів і співробітників.

Структура бази даних представлена наступною діаграмою сутність-зв'язок (ER).

pic

Популярність жанрів з часом

Мета: Дізнатися, як змінилася популярність музичних жанрів з часом.

У цьому випадку популярність визначається за кількістю проданих треків.

Підхід:

  1. Обчислити кількість проданих треків у кожному році для кожного жанру.
  2. Рангувати ці жанри за кількістю проданих треків
    *DENSE_RANK() OVER (PARTITION BY SaleYear ORDER BY TracksSold DESC) AS GenreRankЦя частина присвоює номер рангу кожному жанру на основі кількості проданих треків, згрупованих по кожному році продажів.
  3. Витягнути лише топ 3 найпопулярніших жанрів у кожному році.
/* Еволюція жанрів з часом*/  

WITH GenreSales AS (  
 SELECT  
 STRFTIME('%Y', InvoiceDate) AS SaleYear,  
 t4.Name AS GenreName,  
 COUNT(t1.InvoiceLineId) AS TracksSold -- Підрахунок позицій в рахунках  
 FROM invoice_items t1  
 JOIN invoices t2 ON t1.InvoiceId = t2.InvoiceId  
 JOIN tracks t3 ON t1.TrackId = t3.TrackId  
 JOIN genres t4 ON t3.GenreId = t4.GenreId  
 GROUP BY SaleYear, GenreName  
),  
RankedGenres AS (  
 SELECT   
 SaleYear,  
 GenreName,  
 TracksSold,  
 DENSE_RANK() OVER (PARTITION BY SaleYear ORDER BY TracksSold DESC)   
 AS GenreRank -- Рангуємо жанри по продажах в кожному році  
 FROM GenreSales  
)  
SELECT  
 SaleYear,  
 GenreName,  
 TracksSold  
FROM RankedGenres  
WHERE GenreRank <= 3 -- Обмеження для топ 3 жанрів кожного року.  
ORDER BY SaleYear, TracksSold DESC;

pic

З результатів можна побачити, що "Latin" постійно з'являється в топ 3 жанрів кожного року. Це може бути важливим висновком для компанії, який можна використовувати для подальшої роботи.

Переваги жанрів для клієнтів

Мета: Дізнатися, які жанри є найулюбленішими для кожного клієнта (жанри, на які вони витратили найбільше) і зробити відповідну сегментацію клієнтів.

Підхід:

  1. Витягнути витрати кожного клієнта на жанри.
  2. Рангувати витрати на жанри для кожного клієнта.
  3. Витягнути лише топ 3 жанрів для кожного клієнта.
/* Переваги клієнтів на жанри:*/  

 WITH genre_spending AS (  
 SELECT t5.CustomerId as ID, t5.FirstName AS firstname,   
 t1.Name AS genre_name,  
 ROUND(SUM((t3.UnitPrice)*(t3.Quantity)),2) AS total_spent  
 FROM genres t1  
 JOIN tracks t2 ON t1.GenreId = t2.GenreId  
 JOIN invoice_items t3 ON t2.TrackId = t3.TrackId  
 JOIN invoices t4 ON t3.InvoiceId = t4.InvoiceId  
 JOIN customers t5 ON t4.CustomerId = t5.CustomerId  
 GROUP BY t5.CustomerId, t1.Name   

),  
ranked_genres AS (   
 SELECT ID, firstname, genre_name, total_spent,  
 DENSE_RANK() OVER (PARTITION BY ID ORDER BY total_spent DESC)   
 AS genre_rank   
 FROM genre_spending  
)  
SELECT ID, firstname, genre_name, total_spent  
FROM ranked_genres  
WHERE genre_rank <= 3; -- Фільтруємо для топ 3

pic

Приклад результату. Це жанри, на які Луїс і Леоні витратили найбільше.

Що ми можемо отримати з цієї інформації?

Припустимо, ми хочемо запустити кампанії по email маркетингу.
Сегментація клієнтів на основі їх музичних уподобань дозволяє налаштувати кампанії для підвищення їх ефективності.

Приклад: Цільова аудиторія для жанру "Latin":

Запит нижче є прикладом отримання електронних адрес клієнтів, у яких уподобання жанру — "Latin":

-- приклад отримання електронних адрес клієнтів, у яких уподобання жанру "Latin"  
 WITH genre_spending AS (  
 SELECT t5.CustomerId as ID, t5.FirstName AS firstname,   
 t1.Name AS genre_name,  
 ROUND(SUM((t3.UnitPrice)*(t3.Quantity)),2) AS total_spent, t5.Email  
 FROM genres t1  
 JOIN tracks t2 ON t1.GenreId = t2.GenreId  
 JOIN invoice_items t3 ON t2.TrackId = t3.TrackId  
 JOIN invoices t4 ON t3.InvoiceId = t4.InvoiceId  
 JOIN customers t5 ON t4.CustomerId = t5.CustomerId  
 GROUP BY t5.CustomerId, t1.Name   

),  
ranked_genres AS (   
 SELECT ID, firstname, genre_name, total_spent, email,  
 DENSE_RANK() OVER (PARTITION BY ID ORDER BY total_spent DESC)   
 AS genre_rank   
 FROM genre_spending  
)  
SELECT ID, firstname, total_spent, email  
FROM ranked_genres  
WHERE genre_rank <= 3-- Фільтруємо для топ 3 жанрів  
AND genre_name = 'Latin'

pic

Приклад результату. Це клієнти, які витратили найбільше на жанр Latin порівняно з іншими жанрами.

Вплив підтримки співробітниками на витрати клієнтів

Мета: Проаналізувати, чи показують клієнти, яких підтримували різні співробітники, різні шаблони витрат.

Спочатку можемо проаналізувати організаційну структуру за допомогою наступного запиту.

SELECT employeeid, title, reportsto   
FROM employees;

pic

Результат показує, що лише співробітники з ідентифікаторами 3, 4 та 5 повинні підтримувати клієнтів.

Для подальшого аналізу ми можемо просто отримати кількість клієнтів, середні витрати клієнтів і загальні витрати клієнтів, групуючи по кожному співробітнику, що підтримує.

/* аналізуємо, чи клієнти, яких підтримували різні співробітники,  
 будуть мати різні витрати.*/   

SELECT  
 t1.SupportRepId,  
 COUNT(DISTINCT t1.CustomerId) AS NumberOfCustomers,   
 ROUND(AVG(t2.Total),2) AS AverageCustomerSpending,  
 SUM(t2.total) AS total_sales  
 FROM Customers t1  
 JOIN Invoices t2 ON t1.CustomerId = t2.CustomerId  
 GROUP BY t1.SupportRepId

pic

Результат містить лише співробітників з ідентифікаторами 3, 4 та 5, що відповідає нашому аналізу; це агенти підтримки продажів.

Хоча співробітник 3 згенерував найбільше продажів загалом, співробітник 5 досяг найвищих середніх витрат клієнтів, незважаючи на те, що обслуговував менше клієнтів.

Що робити, якщо у нас є більша команда агентів підтримки продажів?

Якщо ми хочемо чітко визначити тих, хто ще не підтримував клієнтів, нам потрібно внести деякі зміни. Наступний запит допоможе.

SELECT  
 t3.EmployeeId,  
 COUNT(DISTINCT t1.CustomerId) AS NumberOfCustomers,   
 ROUND(AVG(t2.Total),2) AS AverageCustomerSpending,  
 SUM(t2.total) AS total_sales  
 FROM Customers t1  
 JOIN Invoices t2 ON t1.CustomerId = t2.CustomerId  
 RIGHT JOIN employees t3 on t1.SupportRepId = t3.EmployeeId  
 WHERE t3.Title = 'Sales support agent'  
 GROUP BY t3.EmployeeId

Цей запит використовує RIGHT JOIN, щоб включити всіх агентів підтримки продажів, навіть тих, хто ще не працював. Це дозволяє провести повний аналіз ефективності агентів.

Висновок

Ця стаття надає приклади аналізу даних музичного магазину Chinook. Моніторинг тенденцій жанрів може допомогти в прийнятті кращих рішень щодо управління запасами. Використовуючи дані про вподобання клієнтів, можна розробити персоналізовані маркетингові кампанії. Розуміння впливу агентів підтримки продажів дозволяє оцінити їхню ефективність і здійснити цільове навчання.

Ця стаття та SQL запити були написані за допомогою Gemini.

Перекладено з: Chinook music store database analysis using SQL

Leave a Reply

Your email address will not be published. Required fields are marked *