【问题标题】:combining tables so that unrecorded data become zero instead of Null合并表,使未记录的数据变为零而不是 Null
【发布时间】:2018-05-01 16:50:03
【问题描述】:

我有一个一小时内每分钟用户数的数据集,其中仅包含非零条目,我想更新该表以使其包含所有小步舞曲。 目前,如果我插入它而不是导入它,我的第一个希望是这样的:

`

 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;

`

但我想更新我的 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 行

这只是我的测试用例,我还有几天的数据要处理,所以我想要一个命令,我可以在我导入的每个新表上运行,它添加所有缺少的小步舞曲,用户 = 0

【问题讨论】:

  • 好的,我读了几遍,但我仍然不清楚要求。您想用0 替换NULL 值吗?我不确定在列被定义为非空的表中如何包含空值。原始表结构是否有所不同?无论如何,解决方案似乎是给列一个默认值(如果需要,您可以使用 case 语句)但我也不清楚您的要求。

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


【解决方案1】:

由于 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;

【讨论】:

【解决方案2】:

你想插入那些在你的表中不存在的分钟,它直接转换为:

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:

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

【讨论】:

  • 谢谢,第一次插入部分解决了这个问题。我还不明白 coalesce 的真正作用,但我会围绕它玩。
  • COALESCE(table1.users, 0) 是Case When table1.users IS NOT NULL THEN table1.users ELSE 0 END 的快捷方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2018-06-18
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多