У меня есть таблица SQL с номером хранилища столбцов, широтой и долготой, содержащей 1000 хранилищ. Я хочу, чтобы на выходе была одна строка для каждого магазина со столбцами «В пределах 25 миль» и «В пределах 50 миль».
Я знаю, как создать расстояние между двумя координатами, но мне нужно перебрать каждый магазин в таблице и подсчитать, сколько магазинов находится в пределах 25 миль и сколько магазинов находится в пределах 50 миль.
Вот мой текущий код для расчета, как далеко каждый магазин находится от одного указанного магазина:
DECLARE
@GEO1 GEOGRAPHY,
@LAT VARCHAR(10),
@LONG FLOAT(30),
@STORE VARCHAR(10)
SET @STORE = 1
SET @LAT = (select convert(varchar(10),s.latitude) FROM table s where s.storeNumber = @STORE)
SET @LONG = (select convert(float(30),s.longitude) FROM table s where s.storeNumber = @STORE)
SET @geo1= geography::Point(@LAT, @LONG, 4326)
SELECT s.storeNumber
, (@geo1.STDistance(geography::Point(ISNULL(s.latitude,0),ISNULL(s.longitude,0), 4326))) as DISTANCE
FROM table s
@LONG имеет отрицательные значения, и преобразование его в число с плавающей запятой было единственным способом заставить его работать.
Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не имя конкретного продукта базы данных (а ваш код - нестандартный SQL). Добавьте тег для продукта базы данных, который вы используете
Нет, эта информация не нужна для ответа на вопрос.


SELECT s.storeNumber
,(SELECT COUNT(*) FROM tbl WHERE
(
(geography::Point(s.latitude, s.longitude, 4326))
.STDistance(geography::Point(ISNULL(tbl.latitude,0),ISNULL(tbl.longitude,0), 4326))
) / 1609.344 <= 25
) cnt_25
,(SELECT COUNT(*) FROM tbl WHERE
(
(geography::Point(s.latitude, s.longitude, 4326))
.STDistance(geography::Point(ISNULL(tbl.latitude,0),ISNULL(tbl.longitude,0), 4326))
) / 1609.344 <= 50
) cnt_50
FROM tbl s
WHERE storeNumber = 1
Это не то, что я хочу. Я хочу, чтобы на выходе было 1000 строк по 3 столбца. В каждой строке магазинов указано количество магазинов в пределах 25 миль и еще одно количество магазинов в пределах 50 миль.
@RyanStodola см. Отредактированный пост. Вам не нужно указывать географическую переменную. Вы можете просто пересчитать его в режиме реального времени для каждой строки. Примените фильтр storeNumber в предложении WHERE.
Почему у
@LATи@LONGразные типы данных?