昨天我问了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)网格方格中的那些将被忽略。
示例数据:
我需要有一个网格方块列表,其中没有客户来自100 x网格中的10 x 10网格(-50到+50,增量为10)。使用所有可能网格方块的虚拟表并从中减去上述查询可能更容易吗?
答案 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...;