如何计算 T-SQL 中的两个不同列?

Posted

技术标签:

【中文标题】如何计算 T-SQL 中的两个不同列?【英文标题】:How to count two different columns in T-SQL? 【发布时间】:2011-10-16 12:46:27 【问题描述】:

我正在使用 *** 数据转储。现在我有一个 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)

如果我在WHERE-行上添加and tags.tagname = 'scala',那么我会得到所有“scala-questions”的数量。有什么方法可以在同一结果集中(在不同的列中)显示问题总数和包含特定标签的问题数。

因为当我添加 and tags.tagname = 'scala' 时,我无法再看到每月的问题总数。

关于如何将这些结果集合并为一个的任何想法?

【问题讨论】:

【参考方案1】:

如果你使用left outer join 对抗posttagscount(posttags.tagid) 将只计算非空值。而且由于左外连接只包含scala标签,你可以跳过count(distinct posts.id)中的distinct

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)

在这里试试:https://data.stackexchange.com/***/q/107948/

【讨论】:

Mikael - 我从没想过我会看到你忘记加入餐桌的那一天。 posttags.tagid = (从 tagname = 'scala' and posttags.tagid = id 的标签中选择 id) @t-clausen.dk 。我没有。子查询将只返回一行/值。 'scala' 的 ID 是 3143,因此可以使用 3143 编写连接,而不是使用子查询来返回值。 data.stackexchange.com/***/q/107949【参考方案2】:

您需要两个查询才能做到这一点,因为您有两组数据(按月计算的问题和按月计算的 scala 问题)。一种可能的解决方案是使用common table expressions 创建数据的两个“临时视图”。举个例子:

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​

结果可见here。

【讨论】:

以上是关于如何计算 T-SQL 中的两个不同列?的主要内容,如果未能解决你的问题,请参考以下文章

仅计算两个不同列中的空值并显示在一个选择语句中

使用Pandas根据两个不同列中的值计算行数

T-SQL 合并两个具有常见和不常见列的表

t-sql 合并两个表并替换空值

如何根据列比较 unix 中的两个文件

如何在不同条件下聚合两个不同列中的值?