Посчитайте количество городов в которых нет продавцов
Перейти к содержимому

Посчитайте количество городов в которых нет продавцов

  • автор:

Помогите решить задачку по sql

В реляционной базе данных существуют таблицы: Cities — список городов id — первичный ключ name — название population — численность населения founded — год основания country_id — id страны Countries — список стран id — первичный ключ name — название population — численность населения gdp — валовый продукт в долларах Companies — компании id — первичный ключ name — название city_id — город в котором находится штаб-квартира revenue — годовая выручка в долларах labors — численность сотрудников Составьте запрос, который: Для всех стран в базе данных посчитать количество компаний со штаб квартирами в этой стране численность сотрудников в которых больше 1000 человек В результате должны быть только количество компаний и названия стран с населением более 1 миллиона человек и валовым продуктом более 10 миллиардов долларов, у которых суммарная выручка выбранных компаний составляет более 1 миллиарда долларов Мой вариант:

select *, count(labors),count(revenue),FROM Companies group by name HAVING count(labors) >=1000 AND count(revenue) >= 1000000000 

( это я пытался выстроить компании с численность сотрудников > 1000 и доходом более 1ккк) Далее я так полагаю нужно получившийся список сравнить со списком (Countries ) и составить новый список и новый список сравнить со с писком (Cities ) и этот список будет ответом. П.С. Хотелось бы получить не просто ответ но и логику выполнения такого задания.

Отслеживать

13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков

Посчитайте количество городов в которых нет продавцов

Один товарищ рассматривал вариант устроиться на работу в Яндекс на вакансию «Асессор-разработчик».

SQL-задачка от Яндекса

В тестовом задании была задачка на составление SQL-запроса.

Задание:

В реляционной базе данных существуют таблицы:

Cities — список городов:

Countries — список стран

  • id — первичный ключ
  • name — название
  • population — численность населения
  • gdp — валовый продукт в долларах

Companies — компании

  • id — первичный ключ
  • name — название
  • city_id — город в котором находится штаб-квартира
  • revenue — годовая выручка в долларах
  • labors — численность сотрудников

Составьте запрос, который:

Для всех стран в базе данных посчитать количество компаний со штаб квартирами в этой стране численность сотрудников в которых больше 1000 человек.

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

Вариант запроса:

SELECT cou.name AS `Country`, COUNT(com.id)

FROM Companies com

LEFT JOIN Cities cit

ON cit.id = com.city_id

LEFT JOIN Countries cou

ON cit.country_id = cou.id

WHERE com.labors > 1000

AND city_id IN (SELECT cit2.id

FROM Cities cit2

LEFT JOIN Countries cou2

ON cit2.country_id = cou2.id

WHERE cou2.population > 1000000 AND cou2.gdp > 10000000000)

GROUP BY cou.id

HAVING SUM(com.revenue) > 1000000000

Скорее всего опытный SQL’щик посмеется на такой реализацией задачи и сможет написать более оптимальный запрос. Если есть идеи по оптимизации — пишите свои варианты в коментариях.

Краткое описание логики запроса:

1) Во вложенном запросе получаем список id городов, у которых население более 1 миллиона человек, которые находятся в странах, имеющих валовый доход более 10 миллиардов долларов:

city_id IN (SELECT cit2.id

FROM Cities cit2

LEFT JOIN Countries cou2

ON cit2.country_id = cou2.id

WHERE cou2.population > 1000000 AND cou2.gdp > 10000000000)

2) Выводим список стран и количество компаний с помощью объединенного запроса:

SELECT cou.name AS `Country`, COUNT(com.id)

FROM Companies com

LEFT JOIN Cities cit

ON cit.id = com.city_id

LEFT JOIN Countries cou

ON cit.country_id = cou.id

3) Дополнительные условия:

WHERE com.labors > 1000

HAVING SUM(com.revenue) > 1000000000

4) Для группировки компаний в странах используем:

GROUP BY cou.id

Примечание: не рекомендую использовать в качестве готового ответа для отправки в Яндекс, только для анализа и проверки работоспособности, — чтобы потом написать свой вариант реализации. Так как этот вариант решения был отправлен в Яндекс, и, если вы его скопируте, плагиат может быть легко определен.

Тем кому лень создавать таблицы в БД с нуля, могут использовать мой тестовый дамп:

— Дамп структуры для таблица yandexsql.Cities

CREATE TABLE IF NOT EXISTS `Cities` (

`id` int(11) NOT NULL DEFAULT ‘0’,

`name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

`population` int(11) DEFAULT NULL,

`founded` int(11) DEFAULT NULL,

`country_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

— Дамп данных таблицы yandex-sql.Cities:

INSERT INTO `Cities` (`id`, `name`, `population`, `founded`, `country_id`) VALUES

(1, ‘Ульяновск’, 750000, 1648, 1),

(2, ‘Москва’, 3000000, 1420, 1),

(3, ‘Ташкент’, 2500000, 956, 2),

(4, ‘Урумчи’, 900000, 205, 3),

(5, ‘Шанхай’, 3000000, 20, 3);

— Дамп структуры для таблица yandexsql.Companies

CREATE TABLE IF NOT EXISTS `Companies` (

`id` int(11) NOT NULL,

`name` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT »,

`city_id` int(11) NOT NULL,

`revenue` int(11) NOT NULL,

`labors` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

— Дамп данных таблицы yandex-sql.Companies: ~9 rows (приблизительно)

INSERT INTO `Companies` (`id`, `name`, `city_id`, `revenue`, `labors`) VALUES

(1, ‘Супер-софт’, 1, 900000000, 1500),

(2, ‘Мегасофт’, 1, 500000000, 3000),

(3, ‘Ковер-самолет’, 3, 5000000, 3000),

(4, ‘Трах-Тибидох Development’, 3, 1000000000, 5000),

(5, ‘Ур Ум Чи\’ка-1’, 4, 300000, 1001),

(6, ‘Ур Ум Чи\’ка-2’, 4, 520000, 999),

(7, ‘Пу До Нг’, 5, 600000000, 1600),

(8, ‘ZBAA Dev’, 5, 520000000, 2500),

(9, ‘IBS’, 2, 500, 1200);

— Дамп структуры для таблица yandexsql.Countries

CREATE TABLE IF NOT EXISTS `Countries` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,

`population` int(11) DEFAULT NULL,

`gdp` bigint(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

— Дамп данных таблицы yandex-sql.Countries:

INSERT INTO `Countries` (`id`, `name`, `population`, `gdp`) VALUES

(1, ‘Россия’, 3000000, 500000000000),

(2, ‘Узбекистан’, 1000001, 200000000000),

(3, ‘Китай’, 1000000000, 1000000000000);

Функция COUNT (Transact-SQL)

Эта функция возвращает количество элементов, найденных в группе. Функция COUNT работает подобно функции COUNT_BIG. Эти функции различаются только типами данных в возвращаемых значениях. Функция COUNT всегда возвращает значение типа данных int. Функция COUNT_BIG всегда возвращает значение типа данных bigint.

Синтаксис

Синтаксис функции агрегирования

COUNT ( < [ [ ALL | DISTINCT ] expression ] | * >) 

Синтаксис функции аналитики

COUNT ( [ ALL ] < expression | * >) OVER ( [ ] ) 

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

ВСЕ

Применяет агрегатную функцию ко всем значениям. Аргумент ALL используется по умолчанию.

DISTINCT

Указывает, что функция COUNT возвращает количество уникальных значений, не равных NULL.

выражение

Выражение любого типа, кромеimage, ntext и text. COUNT не поддерживает агрегатные функции или вложенные запросы в выражении.

Указывает, что функция COUNT должна учитывать все строки, чтобы определить общее количество строк таблицы для возврата. COUNT(*) не принимает параметров и не поддерживает использование DISTINCT. COUNT(*) не требует параметра выражения, так как по определению он не использует сведения о определенном столбце. Функция COUNT(*) возвращает количество строк в указанной таблице с учетом повторяющихся строк. Она подсчитывает каждую строку отдельно. При этом учитываются и строки, содержащие значения NULL.

OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )

partition_by_clause делит результирующий набор, полученный с помощью предложения FROM , на секции, к которым применяется функция COUNT . Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы. order_by_clause определяет логический порядок выполнения операции. Дополнительные сведения см . в предложении OVER (Transact-SQL ).

Типы возвращаемых данных

  • int NOT NULL , ANSI_WARNINGS если имеет значение ON , однако SQL Server всегда будет обрабатывать COUNT выражения как int NULL в метаданных, если только не упакованы в ISNULL .
  • int NULL , если ANSI_WARNINGS имеет значение OFF .

Замечания

  • COUNT(*) без GROUP BY возврата карта inality (количество строк) в наборе результатов. К ним относятся строки, состоящие из всех NULL значений и дубликатов.
  • COUNT(*) при GROUP BY возврате числа строк в каждой группе. Сюда входят NULL значения и дубликаты.
  • COUNT(ALL ) вычисляет выражение для каждой строки в группе и возвращает количество ненулевого значения.
  • COUNT(DISTINCT *expression*) вычисляет выражение для каждой строки в группе и возвращает количество уникальных, ненулевого значения.

COUNT — это детерминированная функция, если она используется без предложений OVER и ORDER BY. Она не детерминирована при использовании с предложениями OVER и ORDER BY. Дополнительные сведения см. в разделе детерминированные и недетерминированные функции.

ARITHABORT и ANSI_WARNINGS .

Если COUNT имеет возвращаемое значение, превышающее максимальное значение int (то есть 2 31-1 или 2 147 483 647), COUNT функция завершится ошибкой из-за целочисленного переполнения. При COUNT переполнении и параметрах ARITHABORT OFF COUNT ANSI_WARNINGS возвращается. NULL В противном случае, если или есть, ANSI_WARNINGS ARITHABORT ON запрос будет прерваться, и будет вызвана ошибка арифметического переполнения. Msg 8115, Level 16, State 2; Arithmetic overflow error converting expression to data type int. Чтобы правильно обрабатывать эти большие результаты, используйте COUNT_BIG вместо этого, что возвращает bigint.

Если оба ARITHABORT и ANSI_WARNINGS есть ON , вы можете безопасно упаковать COUNT сайты вызовов, ISNULL( , 0 ) чтобы принудить тип выражения вместо int NOT NULL int NULL . Упаковка COUNT в ISNULL означает, что любая ошибка переполнения будет автоматически подавляться, что должно быть рассмотрено для правильности.

Примеры

А. Использование COUNT и DISTINCT

В этом примере возвращается количество различных названий, которые может хранить сотрудник Adventure Works Cycles.

SELECT COUNT(DISTINCT Title) FROM HumanResources.Employee; GO 
----------- 67 (1 row(s) affected) 

B. Использование COUNT(*)

В этом примере возвращается общее количество сотрудников Adventure Works Cycles.

SELECT COUNT(*) FROM HumanResources.Employee; GO 
----------- 290 (1 row(s) affected) 

C. Использование COUNT(*) с другими агрегатами

В этом примере показано, что функция COUNT(*) работает с другими статистическими функциями в списке SELECT . В примере используется база данных AdventureWorks2022.

SELECT COUNT(*), AVG(Bonus) FROM Sales.SalesPerson WHERE SalesQuota > 25000; GO 
----------- --------------------- 14 3472.1428 (1 row(s) affected) 

D. Использование предложения OVER

В этом примере используются MAX AVG MIN функции и COUNT функции с OVER предложением для возврата агрегированных значений для каждого отдела в таблице базы данных HumanResources.Department AdventureWorks2022.

SELECT DISTINCT Name , MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary , MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary , AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary , COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept FROM HumanResources.EmployeePayHistory AS eph JOIN HumanResources.EmployeeDepartmentHistory AS edh ON eph.BusinessEntityID = edh.BusinessEntityID JOIN HumanResources.Department AS d ON d.DepartmentID = edh.DepartmentID WHERE edh.EndDate IS NULL ORDER BY Name; 
Name MinSalary MaxSalary AvgSalary EmployeesPerDept ----------------------------- --------------------- --------------------- --------------------- ---------------- Document Control 10.25 17.7885 14.3884 5 Engineering 32.6923 63.4615 40.1442 6 Executive 39.06 125.50 68.3034 4 Facilities and Maintenance 9.25 24.0385 13.0316 7 Finance 13.4615 43.2692 23.935 10 Human Resources 13.9423 27.1394 18.0248 6 Information Services 27.4038 50.4808 34.1586 10 Marketing 13.4615 37.50 18.4318 11 Production 6.50 84.1346 13.5537 195 Production Control 8.62 24.5192 16.7746 8 Purchasing 9.86 30.00 18.0202 14 Quality Assurance 10.5769 28.8462 15.4647 6 Research and Development 40.8654 50.4808 43.6731 4 Sales 23.0769 72.1154 29.9719 18 Shipping and Receiving 9.00 19.2308 10.8718 6 Tool Design 8.62 29.8462 23.5054 6 (16 row(s) affected) 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

Д. Использование COUNT и DISTINCT

В этом примере функция возвращает количество различных должностей, которые может иметь конкретный сотрудник компании.

USE ssawPDW; SELECT COUNT(DISTINCT Title) FROM dbo.DimEmployee; 

F. Использование COUNT(*)

В этом примере функция возвращает общее количество строк в таблице dbo.DimEmployee .

USE ssawPDW; SELECT COUNT(*) FROM dbo.DimEmployee; 

G. Использование COUNT(*) с другими агрегатами

В этом примере функция COUNT(*) работает с другими статистическими функциями в списке SELECT . Запрос возвращает количество торговых представителей с годовой квотой продаж более 500 000 долл. США и их среднюю квоту продаж.

USE ssawPDW; SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota] FROM dbo.FactSalesQuota WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001; 
TotalCount Average Sales Quota ---------- ------------------- 10 683800.0000 

H. Использование COUNT с ПОМОЩЬЮ HAVING

В этом примере функция COUNT используется с предложением HAVING , чтобы получить список подразделений компании, в каждом из которых работает более 15 сотрудников.

USE ssawPDW; SELECT DepartmentName, COUNT(EmployeeKey)AS EmployeesInDept FROM dbo.DimEmployee GROUP BY DepartmentName HAVING COUNT(EmployeeKey) > 15; 
DepartmentName EmployeesInDept -------------- --------------- Sales 18 Production 179 

I. Использование COUNT с OVER

В этом примере функция COUNT используется с предложением OVER , чтобы получить количество продуктов, содержащихся в каждом из указанных заказов на продажу.

USE ssawPDW; SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount , SalesOrderNumber FROM dbo.FactInternetSales WHERE SalesOrderNumber IN (N'SO53115',N'SO55981'); 
ProductCount SalesOrderID ------------ ----------------- 3 SO53115 1 SO55981 

См. также

  • Агрегатные функции (Transact-SQL)
  • COUNT_BIG (Transact-SQL)
  • Предложение OVER (Transact-SQL)

Функция СЧЁТЕСЛИМН

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel Web App Excel 2010 Еще. Меньше

Функция СЧЁТЕСЛИМН применяет критерии к ячейкам в нескольких диапазонах и вычисляет количество соответствий всем критериям.

Браузер не поддерживает видео.

Это видео — часть учебного курса Усложненные функции ЕСЛИ.

Синтаксис

Аргументы функции СЧЁТЕСЛИМН описаны ниже.

  • Диапазон_условия1. Обязательный аргумент. Первый диапазон, в котором необходимо проверить соответствие заданному условию.
  • Условие1. Обязательный аргумент. Условие в форме числа, выражения, ссылки на ячейку или текста, которые определяют, какие ячейки требуется учитывать. Например, условие может быть выражено следующим образом: 32, «>32», B4, «яблоки» или «32».
  • Диапазон_условия2, условие2. Необязательный аргумент. Дополнительные диапазоны и условия для них. Разрешается использовать до 127 пар диапазонов и условий.

Важно: Каждый дополнительный диапазон должен состоять из такого же количества строк и столбцов, что и аргумент диапазон_условия1. Эти диапазоны могут не находиться рядом друг с другом.

Замечания

  • Каждое условие диапазона одновременно применяется к одной ячейке. Если все первые ячейки соответствуют требуемому условию, счет увеличивается на 1. Если все вторые ячейки соответствуют требуемому условию, счет еще раз увеличивается на 1, и это продолжается до тех пор, пока не будут проверены все ячейки.
  • Если аргумент условия является ссылкой на пустую ячейку, то он интерпретируется функцией СЧЁТЕСЛИМН как значение 0.
  • В условии можно использовать подстановочные знаки: вопросительный знак (?) и звездочку (*). Вопросительный знак соответствует любому одиночному символу; звездочка — любой последовательности символов. Если нужно найти сам вопросительный знак или звездочку, поставьте перед ними знак тильды (~).

Пример 1

Скопируйте образец данных из следующих таблиц и вставьте их в ячейку A1 нового листа Excel. Чтобы отобразить результаты формул, выделите их и нажмите клавишу F2, а затем — клавишу ВВОД. При необходимости измените ширину столбцов, чтобы видеть все данные.

Превышена квота Q1

Превышена квота Q2

Превышена квота Q3

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *