SQL: для циклов для создания новых полей на основе текущих значений

#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 . , , Вы бы повторили логику для каждой страны, о которой вы заботитесь.