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”动态?