Как подсчитать два разных столбца в T-SQL?

Как подсчитать два разных столбца в T-SQL?

30.07.2011 05:08:48 Просмотров 61 Источник

Я играю с StackOverflow datadump. Теперь у меня есть проблема T-SQL:

Я могу выбрать список с количеством вопросов в месяц и год с помощью:

select datepart(year, posts.creationdate) as year,
datepart(month, posts.creationdate) as month, 
count(distinct posts.id) as questions
from posts
inner join posttags on posttags.postid = posts.id
inner join tags on tags.id = posttags.tagid
where posts.posttypeid = 1
group by datepart(month, posts.creationdate), 
datepart(year, posts.creationdate)
order by datepart(year, posts.creationdate), 
datepart(month, posts.creationdate)

Если я добавлю and tags.tagname = 'scala'в WHERE-row, затем я получаю число всех "scala-вопросов". Есть ли способ показать как общее количество вопросов, так и количество вопросов, содержащих определенный тег в одном и том же результирующем наборе (в разных столбцах).

Потому что, когда я добавляю and tags.tagname = 'scala'я больше не могу видеть общее количество вопросов в месяц.

Есть идеи о том, как я могу объединить эти наборы результатов в один?

У вопроса есть решение - Посмотреть?

Ответы - Как подсчитать два разных столбца в T-SQL? / How to count two different columns in T-SQL?

ig0774

30.07.2011 05:31:30

Для этого вам понадобятся два запроса, поскольку у вас есть два набора данных (Вопросы по месяцам и вопросы scala по месяцам). Одним из возможных решений является использование общих табличных выражений для создания двух "временных представлений" данных. В качестве примера:

with total as (
    select datepart(year, posts.creationdate) as year,
           datepart(month, posts.creationdate) as month, 
           count(distinct posts.id) as questions
    from posts
        inner join posttags on posttags.postid = posts.id
        inner join tags on tags.id = posttags.tagid
    where posts.posttypeid = 1
    group by datepart(month, posts.creationdate), datepart(year, posts.creationdate)
), scala as (
    select datepart(year, posts.creationdate) as year,
           datepart(month, posts.creationdate) as month, 
           count(distinct posts.id) as questions
    from posts
        inner join posttags on posttags.postid = posts.id
        inner join tags on tags.id = posttags.tagid
     where posts.posttypeid = 1 and tags.tagname = 'scala'
    group by datepart(month, posts.creationdate), datepart(year, posts.creationdate)
)
select total.year, total.month, total.questions as total_questions, scala.questions as scala_questions
from total
    join scala on total.year = scala.year and total.month = scala.month
order by total.year, total.month​

Результаты которого можно посмотреть здесь .

Является ответом!
Mikael Eriksson

30.07.2011 06:42:00

Если вы используете left outer joinпротив posttags, count(posttags.tagid)будет считать только ненулевые значения. И поскольку левое внешнее соединение содержит только scalaв distinct.

count(distinct posts.id)

Попробуйте здесь: http://data.stackexchange.com/stackoverflow/q/107948/

https://stackoverflow.com/questions/6883290/how-to-count-two-different-columns-in-t-sql/6883842#comment8193454_6883842
Микаэль - я никогда не думал, что увижу день, когда ты забудешь присоединиться к своим столам. posttags.tagid = (выберите id из тегов, где tagname = 'scala' и posttags.код tagid = идентификатор)
https://stackoverflow.com/questions/6883290/how-to-count-two-different-columns-in-t-sql/6883842#comment8193643_6883842
@Т-Клаусен.ДК . Я не. Подзапрос будет возвращать только одну строку / значение. Идентификатор для "scala" - 3143, поэтому соединение могло быть написано с использованием 3143вместо того, чтобы иметь подзапрос для возврата значения. data.stackexchange.com/stackoverflow/q/107949
https://stackoverflow.com/questions/6883290/how-to-count-two-different-columns-in-t-sql/6883842#comment8195314_6883842
Хороший еще раз Микаэль. Я думал.. не бери в голову +1 :)
Закрыть X