如何计算 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
对抗posttags
,count(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 中的两个不同列?的主要内容,如果未能解决你的问题,请参考以下文章