Mysql 表中的Sql插入值在按日期分组的已知集合中丢失
请提供如何最好地解决此问题的任何帮助 为了简化,我有一个由5个状态“a”到“E”组成的表 我有另一张表格,上面有每天的状态量。每天插入新记录。未量化状态时,未插入状态。我需要插入状态和日期,并将数量设置为0Mysql 表中的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'
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