Как посчитать два разных столбца в T-SQL? - PullRequest
1 голос
/ 30 июля 2011

Я играю с набором данных StackOverflow.Теперь у меня есть проблема 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, тогда я получу количество всех "скала-вопросов".Можно ли как-то показать общее количество вопросов и количество вопросов, содержащих определенный тег в одном и том же наборе результатов (в разных столбцах).

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

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

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

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

select datepart(year, posts.creationdate) as year,
       datepart(month, posts.creationdate) as month,
       count(*) as questions,
       count(posttags.tagid) as sc
from posts
  left outer join posttags
    on posttags.postid = posts.id and
       posttags.tagid = (select id
                         from tags
                         where tagname = 'scala')
where posts.posttypeid = 1
group by datepart(month, posts.creationdate),
         datepart(year, posts.creationdate)
order by datepart(year, posts.creationdate),
         datepart(month, posts.creationdate)

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

2 голосов
/ 30 июля 2011

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

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​

Результаты которых можно увидеть здесь .

...