Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用于跟踪全年销售额的SQL关系数据库_Mysql_Sql_Pdo_Phpmyadmin_Relational Database - Fatal编程技术网

Mysql 用于跟踪全年销售额的SQL关系数据库

Mysql 用于跟踪全年销售额的SQL关系数据库,mysql,sql,pdo,phpmyadmin,relational-database,Mysql,Sql,Pdo,Phpmyadmin,Relational Database,我是关系数据库和MySQL的不速之客。我的任务是创建一个应用程序,该应用程序可以跟踪全年直至当天的销售情况。因此,当员工进行销售时,销售金额和销售日期都保存在数据库中 该数据库需要保存当天、每周、每月和年度的当前销售额。它还需要跟踪这些销售属于哪个员工,以及该员工在给定的一天内完成了多少销售 我已经画了一个表,并在MySQL中构建了表。我遇到的问题是(通过在线教程等)听说多对多或连接表不应该有重复 我的连接表就是我的销售表。它与进行销售的员工有多对一的关系,与当天的销售有多对一的关系。因此,员工

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

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

我已经画了一个表,并在MySQL中构建了表。我遇到的问题是(通过在线教程等)听说多对多或连接表不应该有重复

我的连接表就是我的销售表。它与进行销售的员工有多对一的关系,与当天的销售有多对一的关系。因此,员工1一天完成3次销售,我的销售表如下所示:

sale_id | sale_amount | day_id | employee_id
1         500           1        1
2         600           1        1
3         750           1        1
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;
其中,day_id为当前日期,employee_id为employee1。问题1,这是坏的吗?如果是的话,什么是更好的解决方案

问题2,确定一年中的日期/周/月以跟踪所有这些数据的最佳方法是什么?手动输入每周7天,每年52周,每年12个月似乎过于乏味。我在5年内输入,然后第一年输入12个月,第一年输入52周,然后在添加天数之前停止输入,看看是否有更好的解决方案可用

在此方面的任何帮助都将不胜感激。此外,如果可能的话,我想在不使用任何第三方软件的情况下完成这项工作


非常感谢您的帮助

将日期存储为datetime类型,而不是将表存储为天、周、月和年。你只需要两张桌子

员工表

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 ;
销售表

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 ;
从这些表中,您可以按所需的任何期间类型生成任何报告

例如,您可以按员工和周生成一份包含小计的报告,如下所示:

sale_id | sale_amount | day_id | employee_id
1         500           1        1
2         600           1        1
3         750           1        1
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日期函数的更多信息,请查看以下内容。
使用这些功能,您可以按周、日、周、月和年生成报告。

无需汇总表。只需记录销售和员工。简单的查询可以生成日、周、月和年的结果。查看日期/时间函数。如果您将销售日期存储为DRADE或DATETIME或TIMESTEP类型,则这些功能将允许您轻松地按日期变更销售。根据可能的未来报告需求,您可能考虑考虑为部门或部门添加列。我完全同意;MySQL有各种内置的日期数据类型,专门用于简化计算。如果您实现了自己的表来存储日期,那么您将不得不自己做所有那些困难的数学运算(是闰年吗?是闰秒吗?等等)。让MySQL为您实现这一点要容易得多,而且它大大简化了您的数据库结构。这个答案有一个很好的解决方案,我非常感谢你在正确方向上的观点,斯隆!我改变了我的数据库来使用它,它使一切变得更干净,更容易处理。如果我能提高投票率,我仍然需要赢得声誉。:)