Mysql 表中的Sql插入值在按日期分组的已知集合中丢失

Mysql 表中的Sql插入值在按日期分组的已知集合中丢失,mysql,server,Mysql,Server,请提供如何最好地解决此问题的任何帮助 为了简化,我有一个由5个状态“a”到“E”组成的表 我有另一张表格,上面有每天的状态量。每天插入新记录。未量化状态时,未插入状态。我需要插入状态和日期,并将数量设置为0 create table dailyRecords( id int, status varchar(50), Qty int, myDate date ) insert into dailyRecords values (1,'a',10,'2016-02-02'

请提供如何最好地解决此问题的任何帮助

为了简化,我有一个由5个状态“a”到“E”组成的表

我有另一张表格,上面有每天的状态量。每天插入新记录。未量化状态时,未插入状态。我需要插入状态和日期,并将数量设置为0

create table dailyRecords(
  id int,
  status varchar(50),
  Qty int,
  myDate date
  )


  insert into dailyRecords values (1,'a',10,'2016-02-02');
  insert into dailyRecords values (2,'b',10,'2016-02-02');
  insert into dailyRecords values (3,'c',10,'2016-02-02');
  insert into dailyRecords values (4,'a',10,'2016-02-01');
  insert into dailyRecords values (5,'b',10,'2016-02-01');
  insert into dailyRecords values (6,'c',10,'2016-02-01');
  insert into dailyRecords values (7,'d',10,'2016-02-01');
  insert into dailyRecords values (8,'a',10,'2016-01-31');


create table status(
  id int,
  status varchar(50),
  )  

insert into status values (1,'a');
insert into status values (2,'b');
insert into status values (3,'c');
insert into status values (4,'d');
insert into status values (5,'e');
id  status Qty  date
 1,  A      10  2016-02-02
 2,  B      10  2016-02-02
 3,  C      10  2016-02-02
 4,  A      10  2016-02-01
 5,  B      10  2016-02-01
 6,  D      10  2016-02-01
 7,  E      10  2016-02-01
要插入每天缺少的状态,请执行以下操作:

 8,  D      0  2016-02-02
 9,  E      0  2016-02-02

10,  C      0  2016-02-01
下面是一个示例代码:

我已经搜索了论坛,但是添加的日期问题让我困惑

需要帮忙吗


谢谢

您可以使用交叉连接生成包含所有日期和状态的行。然后您可以
左连接
以获取现有值:

select d.date, s.status, coalesce(dr.qty, 0) as qty
from (select distinct date from dailyRecords) d cross join
     (select status from dailyRecords) s left join
     dailyRecords dr
     on dr.date = d.date and dr.status = s.status;

如果您将这些表重新插入表中,那么第一列可以设置为自动递增id。

您可以通过将表连接在一起来实现这一点(以后尝试发布您的表结构,以便我们能够更好地帮助您)

似乎您还需要按其他表结果分组,如果是,则需要以下查询:

SELECT s.date,s.status,coalesce(t.Qty,0) FROM(
SELECT status,CURDATE() as date from statusTable) s
LEFT JOIN (SELECT date,status,count(*) as Qty
           FROM OtherTable
           GROUP BY date,status) t
ON t.date = s.date and t.status = s.status 

感谢@sagi和@Gordon。 以下是完整的工作sql,包括插入:


谢谢你的回复。这是一条正确的道路,不是正确的方向,而是答案@不,戈登。这个选项在我的情况下很有效。我现在需要处理这个查询来处理包含更多列等的实际表。
SELECT s.date,s.status,coalesce(t.Qty,0) FROM(
SELECT status,CURDATE() as date from statusTable) s
LEFT JOIN (SELECT date,status,count(*) as Qty
           FROM OtherTable
           GROUP BY date,status) t
ON t.date = s.date and t.status = s.status 
insert into dailyRecords(mydate,status,qty)
select *
from (
SELECT DISTINCT d.myDate, s.status, COALESCE (dr.Qty, 0) AS qty
FROM         (SELECT DISTINCT myDate
                       FROM          dailyRecords                   
                       ) AS d 
                       cross JOIN
                          (SELECT DISTINCT status
                            FROM          dailyRecords) AS s 
                          LEFT OUTER JOIN
                      dailyRecords AS dr ON dr.myDate = d.myDate AND dr.status = s.status 
    ) as b
where b.qty = 0
ORDER BY myDate, status