我有一个缺少行的MYSQL表,想要一个查询,以便每周“GROUP”具有相同的行数。
在这个例子中,我需要每周工作3天,并希望每周输出相同的天数/行数,以便进一步处理:
week,day,value
1,1,101
1,2,102
1,3,103
2,1,201
2,2,202
3,1,301
3,2,302
我想生产这样的东西 - 每个'周'都有相同的行数。
week,day,value
1,1,101
1,2,102
1,3,103
2,1,201
2,2,202
2,3,NULL
3,1,301
3,2,302
3,3,NULL
使用零或NULL或某些默认值填充'value' - 即使将缺失的日期设置为NULL或某些内容也可以。行/天的数量将始终相同(在这种情况下为3),但任何一周都可能缺少1天或更多天。
我有点难过如何去做。 LEFT JOIN到一个有三行1,2,3的表是可能的吗?
实际表格相当大,手动创建包含所有(周,日)的交叉引用表是不切实际的。
谢谢!
创建声明
CREATE TABLE `new1` (
`week` int(11) DEFAULT NULL,
`day` int(11) DEFAULT NULL,
`value` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
插入声明
INSERT INTO test.new1
(week, day, value)
VALUES
(1,1,101),
(1,2,102),
(1,3,103),
(2, 1, 201),
( 2,2, 202),
( 3, 1, 301),
( 3, 2, 302);
答案 0 :(得分:2)
您可以创建所有可能的周/天组合的列表,然后左键加入现有的表来提取值:
SELECT a.*,b.value
FROM (SELECT *
FROM (SELECT DISTINCT week FROM Table1) wk
,(SELECT DISTINCT day FROM Table1) dy
)a
LEFT JOIN Table1 b
ON a.week = b.`week`
AND a.day = b.`day`
演示:SQL Fiddle
只需添加填充行:
INSERT INTO Table1 (`week`, `day`, `value`)
SELECT a.*,b.value
FROM (SELECT *
FROM (SELECT DISTINCT week FROM Table1) wk
,(SELECT DISTINCT day FROM Table1) dy
)a
LEFT JOIN Table1 b
ON a.week = b.`week`
AND a.day = b.`day`
WHERE b.week IS NULL