Я noobie для реляционных баз данных и MySQL. Мне было поручено создать приложение, которое может отслеживать продажи в течение всего года до дня. Так как работник производит продажу, сумма продажи и день продажи были сохранены в базе данных.
Эта база данных должна поддерживать текущие продажи за день, неделю, месяц и год. Он также должен отслеживать, к какому сотруднику относятся эти продажи, и о том, сколько продаж этот сотрудник сделал в определенный день.
Я нарисовал диаграмму базы данных и создал таблицы в MySQL. Проблема, с которой я сталкиваюсь, я слышал (через онлайн-учебники и т.д.), Что много-много или таблица соединений не должны дублировать.
Хорошо, мой стол соединения - это мой торговый стол. У этого есть много к 1 с сотрудником, который сделал продажу и много к 1 с продажами, сделанными в тот день. Поэтому employee1 делает 3 продаж за один день, моя таблица продаж будет выглядеть так:
sale_id | sale_amount | day_id | employee_id
1 500 1 1
2 600 1 1
3 750 1 1
где day_id - текущий день, а employee_id - employee1. Вопрос 1, это плохо, и если да, то что было бы лучшим решением?
Вопрос 2: какой способ определить день/неделю/месяц года, чтобы отслеживать все эти данные? Вручную вводить 7 дней на каждую неделю, 52 недели на каждый год и 12 месяцев на каждый год кажутся слишком утомительными. Я вступил через 5 лет, затем я ввел 12 месяцев в течение первого года, 52 недели в течение первого года, затем остановился, прежде чем добавлять дни, чтобы приехать сюда, и посмотреть, есть ли лучшее решение.
Любая помощь по этому вопросу будет принята с благодарностью. Также я хотел бы сделать это без дополнительного программного обеспечения сторонних разработчиков, если это возможно.
Любая помощь очень ценится!
Вместо того, чтобы иметь таблицу за дни, недели, месяцы и годы, сохраните дату как тип даты. Вам понадобятся только две таблицы.
Таблица сотрудников:
DROP TABLE IF EXISTS 'employees';
CREATE TABLE IF NOT EXISTS 'tablename' (
'emp_id' INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
'emp_name' VARCHAR(200) NOT NULL DEFAULT '' COMMENT 'Name of employee',
'emp_email' VARCHAR(200) NOT NULL DEFAULT '' COMMENT 'Email address of employee',
'emp_password' VARCHAR(200) NOT NULL DEFAULT '' COMMENT 'Password encoded',
PRIMARY KEY ('emp_id'),
UNIQUE 'idx_emp_name' ('emp_name'),
UNIQUE 'idx_emp_email' ('emp_email')
)
ENGINE=MyISAM
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci
COMMENT 'List of Employees';
Таблица продаж:
DROP TABLE IF EXISTS 'sales';
CREATE TABLE IF NOT EXISTS 'tablename' (
'sale_id' INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
'sale_amount' DOUBLE NOT NULL DEFAULT 0 COMMENT 'Amount Of Sale',
'sale_date' DATETIME NOT NULL DEFAULT '0000-00-00' COMMENT 'Date/Time of sale',
'sale_emp_id' INT(11) NOT NULL COMMENT 'FK To employees',
PRIMARY KEY ('sale_id'),
KEY 'idx_sale_date' ('sale_date'),
KEY 'idx_sale_emp_id' ('sale_emp_id')
)
ENGINE=MyISAM
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci
COMMENT 'List of Employees';
-- ==============================================================================================
-- TRIGGER: Update sale_date timestamp on sales
-- ==============================================================================================
DELIMITER |
DROP TRIGGER IF EXISTS 'sales_CreatedTS'|
CREATE TRIGGER 'sales_CreatedTS' BEFORE INSERT ON 'sales'
FOR EACH ROW
BEGIN
SET NEW.'sale_date' = CURRENT_TIMESTAMP;
END|
DELIMITER ;
Из этих таблиц вы можете создать любой отчет по любому типу периода, который вам нужен.
Например, вы можете подготовить отчет сотрудника и недели с промежуточными итогами, например:
SELECT
a.'emp_name',
WEEK(b.'sale_date') as 'week_no',
SUM(b.'sale_amount') as 'total_sales_for_week'
FROM 'employees' a
JOIN 'sales' b
ON a.'emp_id' = b.'sales_emp_id'
GROUP BY WEEK(b.'sale_date'),a.'emp_id' WITH ROLLUP;
Для получения дополнительной информации о функциях даты MySQL смотрите эту ссылку. С помощью этих функций вы можете создавать отчеты по дням недели, дате, неделе, месяцу и году.