将日期存储为日期时间类型,而不是包含天、周、月和年的表格。您只需要两张桌子。
员工表:
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 日期函数的更多信息,请查看reference。
使用这些函数,您可以按星期几、日期、星期、月份和年份生成报告。