Запрос суммировать по одному значению в одном столбце и фильтровать по уникальным значениям в другом столбце - PullRequest
0 голосов
/ 28 октября 2019

Столкнулся с проблемой SQL-запроса, как показано ниже:

Id, Val1, Val2, Lat,  Lon
1,  10.1, 20.3, 30.5, 120.3
2,  12.4, 15.7, 25.3, 110.7
3,  10.1, 24.5, 27.8, 115.0
4,  10.1, 18.9, 25.3, 110.7

Получить сумму (Val2) для строк, которые соответствуют Val1, но имеют уникальный Lat, Lon без совпадения с любой другой строкой. Результат в этом примере будет 20,3 (строка 1) + 24,5 (строка 3) = 44,8. Строка 4 игнорируется, так как это Lat, Lon совпадает со строкой 2.

Каким будет запрос для возврата суммы в этом случае?

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

Этот запрос должен дать вам желаемые результаты. Это SUM s Val2 для каждого Val1, если не найдено подходящих значений Lat и Lon для другого значения Id:

SELECT Val1, COALESCE(SUM(Val2), 0) AS "Sum"
FROM data d
WHERE NOT EXISTS(SELECT *
                 FROM data d1
                 WHERE d1.Id != d.Id AND d1.Lat = d.Lat AND d1.Lon = d.Lon)
GROUP BY Val1

Выход

Val1    Sum
10.1    44.8

Демонстрация на dbfiddle

0 голосов
/ 28 октября 2019

Вот как я могу подойти к этой проблеме:

Установить данные:

drop table if exists #t
create table #t (id int, val1 numeric(4, 1), val2 numeric(4, 1), lat numeric(4, 1), lon numeric(4, 1))
insert #t (Id, Val1, Val2, Lat, Lon) 
values 
(1, 10.1, 20.3, 30.5, 120.3),
(2, 12.4, 15.7, 25.3, 110.7),
(3, 10.1, 24.5, 27.8, 115.0),
(4, 10.1, 18.9, 25.3, 110.7)

И выполнить фактический запрос:

select sum(val2)
  from #t t
  left join (select lat, lon
              from #t
             group by lat, lon
            having count(*) > 1) u
   on t.lat = u.lat
  and t.lon = u.lon
 where u.lat is null
0 голосов
/ 28 октября 2019

Вы можете попробовать эту опцию ниже -

Демо здесь

SELECT SUM(Val2) 
FROM your_table
WHERE CAST(Lat AS VARCHAR)+CAST(Lon AS VARCHAR) IN
(
    SELECT CAST(Lat AS VARCHAR)+CAST(Lon AS VARCHAR)
    FROM your_table
    GROUP BY Lat,Lon
    HAVING COUNT(*) = 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...