#sql #database
#sql #База данных
Вопрос:
Это может быть странный вопрос, потому что я никогда не пробовал это, и он просто пришел мне в голову. У меня есть таблица, которая содержит столбец с именем «страны» вместе с идентификаторами пользователя и датой. Я хотел бы подсчитать, что для каждой страны, сколько пользователей были активны в каждый конкретный день. Самое простое, что пришло мне в голову, это создать новые поля, такие как country_usa, которые показывают количество пользователей в США. Например:
date ___ country_usa ___ country_england ____ country_mexico
2020 ___ 344. ____ 566 ____ 889876
2019 ___ 678 _____ 7899. ____ 8765
Я знаю, что могу создать что-то вроде приведенной выше таблицы, используя метод case. например
select case when country = 'usa' then count(distinct player_id) end as country_usa
Тем не менее, кажется, что это большая работа, особенно из-за того, что в моей таблице так много стран. Каков более быстрый способ сделать это? Возможно ли это сделать с помощью цикла?
Ответ №1:
Вместо этого вы могли бы создать представление, которое представляет собой просто суммирование значений.
Select Country, date, Count(player_id) from Table
Group By Country, date
Редактировать: вы также можете использовать функцию PIVOT
SELECT date, [usa] AS country_usa , [england] AS country_england , [mexico] AS country_mexico
FROM
(SELECT Select Country, date, player_id FROM table) p
PIVOT
(
COUNT (player_id )
FOR Country IN
( [usa], [england], [mexico])
) AS pvt
ORDER BY pvt.date;
возможно, вам потребуется очистить его для синтаксиса, но я думаю, это то, что вы ищете
Комментарии:
1. отлично! но мне это нужно в обратном формате. как то, что я упомянул выше. Возможно ли это сделать?
2. Да, вам нужно будет использовать функцию Pivot, вы можете найти информацию здесь, я отредактирую свой комментарий, чтобы показать пример learn.microsoft.com/en-us/sql/t-sql/queries /…
3. Идеально! Большое вам спасибо 🙂
4. Готово, я надеюсь, это то, что вы искали
Ответ №2:
Вы хотите case
, чтобы в качестве аргумента count()
функции:
select count(distinct case when country = 'usa' then player_id end) as country_usa
Комментарии:
1. Спасибо! но это создает только поле для country_usa, существует ли такая вещь, как цикл, который может сделать это автоматически для всех стран?
2. @Josh . , , Вы бы повторили логику для каждой страны, о которой вы заботитесь.