组合表使未记录的数据变为零而不是Null

时间:2018-05-01 16:50:04

标签: sql select missing-data insert-into hour

我有一小时内每分钟用户的数据集,只包含非零条目,我想更新表格,使其包含所有小步骤。 目前我的第一个想要这样,如果我插入它而不是导入它:

`

 CREATE TABLE table1 (minute INT NOT NULL, users INT NOT NULL);
     INSERT INTO table1 (minute, users) VALUES (32,1);
     INSERT INTO table1 (minute, users) VALUES (40,1);
     INSERT INTO table1 (minute, users) VALUES (41,1);
     INSERT INTO table1 (minute, users) VALUES (51,1);
     INSERT INTO table1 (minute, users) VALUES (52,1);

`

我希望一小时内的其他55分钟与0位用户一起出现。范围是(0-59)

帮助我创建第二个表

`

 CREATE TABLE m_fix
    (minute INT NOT NULL, users INT NOT NULL); 
    INSERT INTO m_fix (minute, users) VALUES (0,0);
    INSERT INTO m_fix (minute, users) VALUES (1,0);
    INSERT INTO m_fix (minute, users) VALUES (2,0);
    INSERT INTO m_fix (minute, users) VALUES (3,0);......

`

我能够通过此代码进行选择联接以显示我想要的信息:

`

SELECT
     m_fix.minute,
     Case
     When table1.users IS NULL THEN m_fix.users
     ELSE table1.users
     END AS users
     FROM m_fix
     LEFT JOIN table1 ON m_fix.minute=table1.minute;

`

但是我想更新my table1而不是运行查询,因为我最终会将这些数据导出到其他地方。 要做到这一点,我做了这个代码:

`

INSERT INTO dbo.table1
 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.fix.minute!= dbo.table1.minute;
 Select * From dbo.table1;

`

它只是让我的旧表1有5行

这只是我的测试用例,我有更多的数据要处理,所以我想要一个命令我可以在我导入的每个新表上运行,添加所有缺少的minuets with user = 0

2 个答案:

答案 0 :(得分:0)

由于NULL不等于NULL,因此WHERE子句无意中过滤了您要检索的数据。

更改此部分:

 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.fix.minute!= dbo.table1.minute;

对此:

 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.table1.minute IS NULL;

答案 1 :(得分:0)

您想要插入表格中不存在的分钟数,这些分钟数直接转换为:

INSERT INTO dbo.table1
 SELECT fix.minute, users
 FROM dbo.fix
 WHERE NOT EXISTS
  (
    SELECT * 
    FROM dbo.table1
    WHERE dbo.fix.minute=dbo.table1.minute -- same minute
  )

当您希望它们为零时,可以使用COALESCE简化您的选择:

SELECT
   m_fix.minute,
   COALESCE(table1.users, 0) AS users
FROM m_fix
LEFT JOIN table1
ON m_fix.minute=table1.minute;