Сравните строку varchar, чтобы получить список пропущенных элементов - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть таблица с колонкой.В столбце хранятся местоположения с использованием varchar в качестве типа данных.Местоположения используют формат -2,7 -25,30 и т. Д. Я пытаюсь составить список отсутствующих мест, т. Е. Там, где у нас нет клиентов.

Местоположения варьируются от -30,-30 до 30,30,Я не могу найти способ настроить цикл для запуска, хотя все параметры.Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Microsoft SQL Server 2017

;WITH cte as (
    select -30 as n --anchor member
    UNION ALL
    select n + 1  --recursive member
    from cte
    where n < 31
)
select z.* 
    from ( 
        select CONCAT(y.n,',',x.n) as locations 
        from cte as x CROSS JOIN cte y 
    ) as z
    LEFT OUTER JOIN dbo.Client as cli ON cli.client_location = z.locations
where cli.client_location IS NULL
order by z.locations asc
0 голосов
/ 17 февраля 2019

Я бы пошел с рекурсивным CTE.Это небольшое изменение подхода SNR:

with cte as (
      select -30 as n --anchor member
      union all
      select n + 1  --recursive member
      from cte
      where n < 30
     )
select cte.x, cte.y,
       concat(cte_x.n, ',', cte_y.n) as missing_location
from cte cte_x cross join
     cte cte_y left join
     dbo.client c
     on c.client_location = concat(cte_x.n, ',', cte_y.n) 
where c.client_location is null;

Или чтобы избежать concat() дважды:

select cte.x, cte.y, v.location as missing_location
from cte cte_x cross join
     cte cte_y cross apply
     (values (concat(cte_x.n, ',', cte_y.n))
     ) v(location) left join
     dbo.client c
     on c.client_location = v.location
where c.client_location is null;
0 голосов
/ 17 февраля 2019

Генерация всех комбинаций.

Затем сопоставьте сгенерированные с существующими комбинациями.

WITH DIGITS AS
(
   SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS val(n)
),
NUMS AS
(
    SELECT (tens.n * 10 + ones.n)-50 AS n
    FROM DIGITS ones
    CROSS JOIN DIGITS tens
),
LOCATIONS AS
(
     SELECT CONCAT(n1.n,',',n2.n) AS location, n1.n as n1, n2.n as n2
     FROM NUMS n1
     JOIN NUMS n2 ON n2.n BETWEEN -30 AND 30
     WHERE n1.n BETWEEN -30 AND 30
)
SELECT loc.location
FROM LOCATIONS loc
LEFT JOIN
(
     SELECT Client_Location, COUNT(*) Cnt
     FROM dbo.Client 
     GROUP BY Client_Location
) cl ON cl.Client_Location = loc.location
WHERE cl.Client_Location IS NULL
ORDER BY loc.n1, loc.n2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...