【问题标题】:Show Null Values for SQL Grid in Virtual Table在虚拟表中显示 SQL 网格的空值
【发布时间】:2017-01-10 17:24:29
【问题描述】:

我昨天问this关于如何计算方格中的客户数量的问题,我得到的解决方案是:

SELECT 10 * (customer_x / 10), 10 * (customer_y / 10), COUNT (*) FROM t_customer GROUP BY customer_x / 10, customer_y / 10 ORDER BY 3 DESC;

现在我需要显示包含零个客户的网格方块,但我不确定如何执行此操作,因为查询是基于通常数字的计算,并且表格中实际上并不存在网格。我应该使用 ISNULL() 函数吗?我当前数据库中此查询的结果是:

90|90|7
30|20|4
-20|-40|2
-10|-20|2
-10|-10|2
-40|-40|1
-40|-30|1
-40|30|1
-30|0|1
-20|0|1
-20|30|1
-10|-30|1
-10|40|1
0|-20|1
0|-10|1
0|0|1
0|10|1
0|40|1
10|20|1
20|20|1
30|-40|1
30|30|1

但是考虑到该区域有 100 个方格,有很多没有客户。我只需要一个查询,它将显示除上述网格正方形之外的所有内容。我正在使用 SQLite3,任何帮助将不胜感激。 (90,90) 方格中的那些将被忽略。

样本数据:

我需要从 10 x 10 网格(-50 到 +50,以 10 为增量)中的 100 个网格方块中列出没有客户的网格方块。使用所有可能的网格正方形的虚拟表并从中减去上述查询可能更容易?

【问题讨论】:

  • 查询返回(数据基于)数据库中的行。你能添加“空”行吗?
  • 我该怎么做?
  • 带插入。是否有任何列来区分空行和有效行?
  • 所有客户行已完全填满。唯一的列是 customer_id、customer_x 和 customer_y,因此没有空行但有不包含客户的网格。
  • 显示一些样本数据,以及想要的结果。

标签: sql sqlite gis grid-layout


【解决方案1】:

要显示(空)方格,请为其添加一个虚拟行,customer_id 为 NULL。 NULL 值不计入:

SELECT ...x...,
       ...y...,
       COUNT(customer_id)
FROM t_customer
GROUP BY ...x..., ...y...;

如果无法更改数据库,则必须使用递归 common table expression 生成空行:

WITH RECURSIVE range(i) AS (
  -- from -90 to +90 in steps of 10
  SELECT -90
  UNION ALL
  SELECT i + 10
  FROM range
  LIMIT 19
), empty(x, y, customer_id) AS (
  SELECT x.i,
         y.i,
         NULL
  FROM       range AS x
  CROSS JOIN range AS y
)
SELECT ...x...,
       ...y...,
       COUNT(customer_id)
FROM (SELECT * FROM t_customer
      UNION ALL
      SELECT * FROM empty)
GROUP BY ...x..., ...y...;

【讨论】:

  • 我不确定我是否完全明白你的意思?我无法更改实际的数据库,这一切都必须在查询中完成。
  • 我应该逐字输入吗?将此输入终端,我得到Error: near ".": syntax error
  • ...x... 代表你的坐标舍入的东西。
  • 这会产生以下结果:-90||19 -80||19 -70||19 -60||19 -50||19 -40||19 -40|-440|1 -40|-390|1 -40|350|1 -30||19 -30|-40|1 -20||19 -20|-420|2 -20|-30|1 -20|300|1 -10||19 -10|-310|1 -10|-240|2 -10|-100|2 -10|410|1 0||19 0|-290|1 0|-190|1 0|60|1 0|140|1 0|400|1 10||19 10|280|1 20||19 20|250|1 30||19 30|-460|1 30|240|4 30|360|1 40||19 50||19 60||19 70||19 80||19 90||19 90|990|7 我不确定这是否正确?
  • 我也不确定。我怎么知道你想要什么坐标,或者你实际使用的是什么查询?
猜你喜欢
  • 2021-09-25
  • 2017-12-18
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多