查询将虚拟数据放入缺失的行中

时间:2014-02-20 17:08:17

标签: mysql sql

我有一个缺少行的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);

1 个答案:

答案 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