SQL关系数据库,用于跟踪全年的销售情况

时间:2018-08-17 21:09:21

标签: mysql sql pdo phpmyadmin relational-database

我是关系数据库和MySQL的入门者。我的任务是创建一个应用程序,该应用程序可以跟踪全年的销售情况。因此,当员工进行销售时,销售金额和销售日期将保存在数据库中。

该数据库需要保留当天,每周,每月和每年的当前销售额。它还需要跟踪这些销售所属的员工以及该员工在给定的一天内完成了多少销售。

我画了一个database diagram并在MySQL中建立了表。我遇到的问题是(通过在线教程等)我听说多对多表或联结表不应重复。

好吧,我的联结表就是我的销售表。与进行销售的员工多对一,与当天进行的销售多对一。因此,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周,然后停了下来,然后再增加几天来这里,看看是否有更好的解决方案。

在此方面的任何帮助将不胜感激。另外,如果可能的话,我也希望没有任何其他第三方软件。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分: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日期函数的更多信息,请参见此{{3}}。 使用这些功能,您可以按星期,日期,星期,月份和年份生成报告。