2017-01-10 4 views
1

вчера я спросил this вопрос о том, как рассчитать количество клиентов в квадрате сетки, и решение, которое я получил, было:Показать нулевые значения для SQL сетки в виртуальной таблице

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 квадратов сетки в 10 х 10 сетки (от -50 до +50 с шагом 10). Может быть проще использовать виртуальную таблицу всех возможных квадратов сетки и вычесть из нее вышеуказанный запрос?

+0

A возвращает запрос (данные на основе) строки, которые находятся в базы данных. Не могли бы вы добавить «пустые» строки? –

+0

Как мне это сделать? –

+0

С INSERT. Существуют ли какие-либо столбцы для различения пустых и допустимых строк? –

ответ

0

Чтобы создать квадрат квадрата (пустой), добавьте для него фиктивный ряд с из 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...; 
+0

Я не уверен, что я понял, что вы имеете в виду? Я не могу изменить фактическую базу данных, все это нужно сделать в запросе. –

+0

Должен ли я вступить в эту дословную? Вводя это в терминал, я получаю «Ошибка: рядом». »: Синтаксическая ошибка' –

+0

Это' ... x ... 'представляет собой ваше округление округления. –

Смежные вопросы