SQL реляционная база данных для отслеживания продаж в течение года

0

Я 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 недели в течение первого года, затем остановился, прежде чем добавлять дни, чтобы приехать сюда, и посмотреть, есть ли лучшее решение.

Любая помощь по этому вопросу будет принята с благодарностью. Также я хотел бы сделать это без дополнительного программного обеспечения сторонних разработчиков, если это возможно.

Любая помощь очень ценится!

  • 0
    Нет необходимости в таблицах сумм. Просто запишите продажу и сотрудника. Простые запросы могут давать результаты за отдельные дни, недели, месяцы и год. Посмотрите на функции даты / времени. Если вы сохраняете дату продажи в виде даты или даты или времени, то эта функция позволит вам легко разбить продажи по вариантам даты.
  • 0
    Вы можете рассмотреть возможность добавления столбцов для подразделений или отделов в зависимости от возможных будущих потребностей в отчетности.
Теги:
phpmyadmin
relational-database
pdo

1 ответ

1
Лучший ответ

Вместо того, чтобы иметь таблицу за дни, недели, месяцы и годы, сохраните дату как тип даты. Вам понадобятся только две таблицы.

Таблица сотрудников:

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 смотрите эту ссылку. С помощью этих функций вы можете создавать отчеты по дням недели, дате, неделе, месяцу и году.

  • 0
    Я полностью согласен; MySQL имеет различные встроенные типы данных для дат, чтобы упростить вычисления. Если вы реализуете свои собственные таблицы для хранения даты, вам придется делать всю эту сложную математику самостоятельно (это високосный год? Была ли еще секунда ?, и т. Д.). Намного проще позволить MySQL сделать это за вас, и это значительно упростит структуру вашей базы данных. Этот ответ имеет довольно хорошее предложенное решение.
  • 1
    Большое спасибо за точку в правильном направлении Слоан! Я переключил свои базы данных, чтобы использовать это, и это сделало все намного чище и легче работать. Если бы я мог поднять голос, я бы все равно нуждался в репутации. :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню