Как посчитать несколько категорий (не считая строки) с помощью SQL Server - PullRequest
0 голосов
/ 29 апреля 2019

Допустим, у меня есть такая таблица:

 country   province   city   people
 __________________________________
 country1  province1  city1   200 
 country1  province1  city2   150 
 country1  province2  city3   350
 country2  province3  city4   75

Мне нужно показать, сколько стран, сколько провинций, сколько городов и сколько у меня людей. Затем мне нужно показать, сколько людей в каждом городе, каждой провинции и каждой стране.

Я уже пробовал Count(Distinct), но его нельзя использовать с разделом.

Ответы [ 5 ]

0 голосов
/ 29 апреля 2019

Не понимаю, зачем вам нужно count(distinct) для населения. Как насчет этого?

select country, province, city, sum(people) 
from t
group by grouping sets ( (country, province, city), (country, province), (country) );

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

Для подсчета чисел для каждой группы требуется что-то вроде этого:

select count(distinct country) as num_countries,
       count(distinct country + ':' + province) as num_provinces,
       count(distinct country + ':' + province + ':' + city) as num_cities

SQL Server не допускает множественных аргументов для count(distinct).

0 голосов
/ 29 апреля 2019

Этот следующий скрипт вернет все ваши результаты в одну строку. Но если вы хотите, чтобы каждый результат находился в отдельной строке, вам может потребоваться использовать UNION для достижения ожидаемого набора результатов.

SELECT COUNT(DISTINCT Country) [Number of Country],
COUNT(DISTINCT Province) [Number of Province],
COUNT(DISTINCT City) [Number of City],
SUM(People) [Total People]
FROM (
    VALUES
            ('country1','province1','city1',200),
            ('country1','province1','city2',150 ),
            ('country1','province2','city3',350),
            ('country2','province3','city4',75)
    ) 
    V([Country],[Province],City,People);
0 голосов
/ 29 апреля 2019

Ты рядом, Энди.Count (Distinct ...) - правильный путь.

Если вы хотите узнать, сколько стран существует, используйте:

select count(distinct(country)) from yourtable;

Сколько провинций?Подсчет городов похож на провинцию.

select count(distinct(province)) from yourtable;

Сколько людей?

select sum(people) from yourtable;

Для людей нельзя просто считать.Вам нужно будет сложить все числа.

0 голосов
/ 29 апреля 2019

Вы можете попробовать следующий подход, чтобы получить желаемый счет:

CREATE TABLE #YourTable(country varchar(20),province varchar(20),city varchar(20),people int)

INSERT #YourTable(country,province,city,people)VALUES
('country1','province1','city1',200),
('country1','province1','city2',150),
('country1','province2','city3',350),
('country2','province3','city4',75)

SELECT 'Distinct Countries' AS type, COUNT(DISTINCT country) from #YourTable
UNION ALL
SELECT 'Distinct province' AS type, COUNT(DISTINCT province) from #YourTable
UNION ALL
SELECT 'Distinct City' AS type, COUNT(DISTINCT city) from #YourTable
UNION ALL
SELECT CONCAT('Distinct ', Country,' ', province,' ', city), count(people)
FROM #YourTable
GROUP BY ROLLUP(country, province, city) 
0 голосов
/ 29 апреля 2019

Может быть GROUP BY с GROUPING SETS поможет вам:

SELECT
  --GROUPING_ID(country,province,city),
  CASE GROUPING_ID(country,province,city)
    WHEN 7 THEN 'total'
    WHEN 3 THEN 'country total - '+country
    WHEN 1 THEN 'province total - '+province
    ELSE 'city - '+city
  END row_title,
  country,
  province,
  city,
  COUNT(DISTINCT province) province_count,
  COUNT(DISTINCT city) city_count,
  SUM(people) people_count
FROM YourTable
GROUP BY GROUPING SETS(
      (country,province,city),
      (country,province),
      (country),
      ()
    )
ORDER BY country,province,city

Данные испытаний:

CREATE TABLE YourTable(country varchar(20),province varchar(20),city varchar(20),people int)

INSERT YourTable(country,province,city,people)VALUES
('country1','province1','city1',200),
('country1','province1','city2',150),
('country1','province2','city3',350),
('country2','province3','city4',75)

Также попробуйте использовать следующее:

SELECT column_name,value
FROM
  (
    SELECT
      COUNT(DISTINCT province) [province count],
      COUNT(DISTINCT city) [city count],
      SUM(people) [people count]
    FROM YourTable
  ) q UNPIVOT(value FOR column_name IN([province count],[city count],[people count])) u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...