在虚拟表

时间:2017-01-10 17:24:29

标签: sql sqlite gis grid-layout

昨天我问了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)网格方格中的那些将被忽略。

示例数据:

Sample Data Image

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

1 个答案:

答案 0 :(得分:0)

要显示(空)网格方块,请为其添加一个虚拟行,其中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...;