Подсчет полей в таблице с критериями - PullRequest
0 голосов
/ 14 марта 2019

Итак, я пытаюсь понять, как рассчитать количество, основываясь на таблице, которая похожа на таблицу ниже, но с гораздо большим количеством стран по всему миру. -

Country1|Country2
   UK   | USA
   UK   | USA
   UK   | USA
   UK   | UK
   USA  | UK

Я пытаюсь подсчитать каждое поле примерно так, основываясь на приведенной выше таблице

Country1|Country2
   1    | 1
   1    | 1
   1    | 1
   1    | 0
   1    | 1

И я хочу, чтобы он вернулся -

 CountryName | Count
    UK       |  5
    USA      |  4

Как я упоминал выше, это должно быть динамичным и учитывать любое количество стран. Все страны названы одинаково, поэтому США всегда будут США, а не Соединенными Штатами Америки.

спасибо!

РЕДАКТИРОВАТЬ - я приложил запрос, который я использую, чтобы вернуть строки для большей ясности,

 Select 
 country1
 country2
 FROM Country1Database c1Db
 join Country2Database c2Db on c1db.MatchID = c1db.MatchID

Ответы [ 4 ]

0 голосов
/ 14 марта 2019

Пример данных

IF OBJECT_ID('dbo.SampleData') IS NOT NULL
DROP TABLE SampleData

CREATE TABLE SampleData (Country1 VARCHAR(20),Country2 VARCHAR(20)  )
INSERT INTO SampleData 
 SELECT 'UK'   , 'USA'  UNION ALL
 SELECT 'UK'   , 'USA'  UNION ALL
 SELECT 'UK'   , 'USA'  UNION ALL
 SELECT 'UK'   , 'UK'   UNION ALL
 SELECT 'USA'  , 'UK'

SELECT * FROM SampleData

Скрипт Sql с использованием UNPIVOT

SELECT DISTINCT CountryName,
        COUNT(CountryData)OVER (PARTITION BY CountryName ORDER BY CountryName) AS CountryData
FROM
(
SELECT CountryName,CountryData
FROM
(
SELECT  Country1,
        Country2 
FROM SampleData
)AS SRC
UNPIVOT
(
CountryName FOR CountryData IN ([Country1],[Country2])
) AS Upvt
)dt

Результат

CountryName     CountryData
----------------------------
    UK              6
    USA             4
0 голосов
/ 14 марта 2019

Хммм.,,Один из способов - отключить и сосчитать отдельные строки:

select v.country, count(distinct seqnum)
from (select row_number() over (select null) as seqnum, t.*
      from t
     ) t cross apply
     (values (t.country1), (t.country2)) v(country)
group by v.country;

Другой способ - настроить логику, чтобы страна не учитывалась дважды в одной строке: j

select v.country, count(*)
from (t cross apply
     (values (t.country1)
             (case when t.country2 <> t.country1 then country2 end) 
     ) v(country)
where v.country is not null
group by v.country;

Этоверсия должна иметь лучшую производительность.

0 голосов
/ 14 марта 2019

С UNION ALL:

select t.country countryname, count(*) counter from (
  select country1 country from countries
  union all
  select country2 country from countries where country2 <> country1
) t
group by t.country

См. Демоверсию

0 голосов
/ 14 марта 2019

Вы хотите apply:

select CountryName, count(*)
from table t cross apply 
     ( values (country1), (case when country2 <> country1 then country2 end) 
     ) tt(CountryName)
where CountryName is not null
group by CountryName; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...