MySQL查询:从数据库中选择现有月份,并与一年中剩余月份一起动态完成
我有两张桌子:MySQL查询:从数据库中选择现有月份,并与一年中剩余月份一起动态完成,sql,mysql,datetime-generation,Sql,Mysql,Datetime Generation,我有两张桌子: CREATE TABLE 'sales_sheet' ( `_id` int(11) NOT NULL AUTO_INCREMENT, `_typed_by` int(11) DEFAULT NULL, `_product_id` int(11) DEFAULT NULL, `_year` date DEFAULT NULL, `_validation_state` int(11) DEFAULT NULL, PRIMARY KEY (`_id`),
CREATE TABLE 'sales_sheet' (
`_id` int(11) NOT NULL AUTO_INCREMENT,
`_typed_by` int(11) DEFAULT NULL,
`_product_id` int(11) DEFAULT NULL,
`_year` date DEFAULT NULL,
`_validation_state` int(11) DEFAULT NULL,
PRIMARY KEY (`_id`),
KEY `_product_id` (`_product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE 'sales_sheet_entries' (
`_id` int(11) NOT NULL AUTO_INCREMENT,
`_sheet_id` int(11) DEFAULT NULL,
`_month` date DEFAULT NULL,
`_quantity` int(11) DEFAULT NULL,
PRIMARY KEY (`_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这两个表用于存储年度销售额表。第一个表存储产品标识符、年份和工作表的验证状态。第二个存储产品的月销售额
我希望在单个查询中获得以下结果:
---------------------------------------------
| Month | Sales volume |
---------------------------------------------
| January 2010 | |
| February 2010 | XXXXXX |
| March 2010 | XXXXXX |
| April 2010 | XXXXXX |
| May 2010 | |
| June 2010 | |
| July 2010 | |
| August 2010 | |
| September 2010 | |
| October 2010 | XXXXXX |
| November 2010 | XXXXXX |
| December 2010 | |
---------------------------------------------
sales volume列中的空字段可能对应于sales_sheet_entries表中已保存的记录,但数据库中没有相应的sales volume或根本不存在,但查询必须显示该记录
我的一个限制是,我不能将12列直接对应于sales_sheet表中的月份列表,因为客户规格正在更改,他可能会要求按期间而不是月份填写销售量
我希望我说得够清楚了,提前谢谢你的帮助&对不起我的英语。MySQL没有递归功能,所以你只能使用数字表技巧了- 创建一个只包含递增数字的表-使用自动递增很容易:
DROP TABLE IF EXISTS `example`.`numbers`;
CREATE TABLE `example`.`numbers` (
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
使用以下命令填充表格:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
…获取所需的任意多个值
用于构建时间列表,根据数字增加月份。id值:
SELECT x.*
FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH)
FROM numbers n) x
根据datetime部分左键连接到数据表:
SELECT DATE_FORMAT(x.dt, '%M %Y') AS Month,
y.sales_volume
FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH) AS dt
FROM numbers n) x
LEFT JOIN (SELECT ss._product_id,
ss._year,
sse._month,
SUM(sse._quantity) AS sales_volume
FROM SALES_SHEET ss
JOIN SALES_SHEET_ENTRIES sse ON sse._sheet_id = ss._id
GROUP BY ss._product_id, ss._year, sse._month) y ON y._month = MONTH(x.dt)
AND y._year = YEAR(x.dt)
AND y._product_id = ?
MySQL没有递归功能,所以只能使用数字表技巧- 创建一个只包含递增数字的表-使用自动递增很容易:
DROP TABLE IF EXISTS `example`.`numbers`;
CREATE TABLE `example`.`numbers` (
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
使用以下命令填充表格:
INSERT INTO NUMBERS
(id)
VALUES
(NULL)
…获取所需的任意多个值
用于构建时间列表,根据数字增加月份。id值:
SELECT x.*
FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH)
FROM numbers n) x
根据datetime部分左键连接到数据表:
SELECT DATE_FORMAT(x.dt, '%M %Y') AS Month,
y.sales_volume
FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 MONTH) AS dt
FROM numbers n) x
LEFT JOIN (SELECT ss._product_id,
ss._year,
sse._month,
SUM(sse._quantity) AS sales_volume
FROM SALES_SHEET ss
JOIN SALES_SHEET_ENTRIES sse ON sse._sheet_id = ss._id
GROUP BY ss._product_id, ss._year, sse._month) y ON y._month = MONTH(x.dt)
AND y._year = YEAR(x.dt)
AND y._product_id = ?
我很惊讶,月份和年份都存储在不同的表中,而且不少于。。。我希望为销售分配一个日期/日期时间字段。然后,您可以创建一个表,其中定义了任意月份/时段,并在时段开始/结束之间的日期时间上进行连接。我已经做了很多次了。你能发布一些示例数据吗?我很惊讶月份和年份都存储在不同的表中,而且不少于。。。我希望为销售分配一个日期/日期时间字段。然后,您可以创建一个表,其中定义了任意月份/时段,并在时段开始/结束之间的日期时间上进行连接。我已经这样做了很多次。你能发布一些示例数据吗?还有一个问题:有没有办法根据表中存储的年份使日期“2010-01-01”动态?还有一个问题:有没有办法根据表中存储的年份使日期“2010-01-01”动态?