TSQL 将 where 子句略有不同的两个计数查询合并为一个输出

TSQL combine two count queries with slightly different where clause into one output

我想将下面的两个 TSQL 查询合并为一个查询。

  -------------------------------------
   USE [ourDB]
  -------------------------------------
  Select   --
 id
 , count(id) as count_30_days_or_less
  --
  FROM Col1 c1  WITH (NOLOCK)
  -- -- -- -- -- -- --
  LEFT JOIN Col2 c2  WITH (NOLOCK)  
  ON (c1.id = c2.foreign_id)
  -- -- -- -- -- -- --
  WHERE
  (
      (DATEDIFF( dd, cast(c1.ourDateTime as Date), cast(GETDATE() as Date)  ) <= 30)
  )
  GROUP BY id
  ORDER BY id
  -------------------------------------
  Select   --
 id
 , count(id) as count_45_days_or_less
  --
  FROM Col1 c1  WITH (NOLOCK)
  -- -- -- -- -- -- --
  LEFT JOIN Col2 c2  WITH (NOLOCK)  
  ON (c1.id = c2.foreign_id)
  -- -- -- -- -- -- --
  WHERE
  (
      (DATEDIFF( dd, cast(c1.ourDateTime as Date), cast(GETDATE() as Date)  ) <= 45)
  )
  GROUP BY id
  ORDER BY id
  -------------------------------------

每次查询都会给出格式 编号 count_YY_days_or_less


目标是以以下格式输出查询: id count_30_days_or_less count_45_days_or_less


注意:除了不同的计数之外,更多 个 ID 实例可能会出现在第二个计数的列中。

接受的答案是正确的。

我有一个"part two": 第 2 部分:有什么方法可以确保上述查询返回的计数中 c1.id 是 "distinct"?

(请参阅 "part two" 答案的已接受答案的评论)

这应该与版本无关,但我使用的是 Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) 2018 年 9 月 7 日 01:37:51

您可以进行条件聚合:

select 
    id,
    sum(case when c1.ourdatetime >= dateadd(day, -30, cast(getdate() as date)) then 1 else 0 end) count_30_days_or_less,
    count(*) as count_45_days_or_less
from col1 c1
left join col2 c2  on c1.id = c2.foreign_id
where c1.ourdatetime >= dateadd(day, -45, cast(getdate() as date))
group by id
order by id

查询筛选最近 45 天的数据(请注意,我简化了您的代码以不在 table 列上使用日期函数 - 这样效率更高)。然后,我们使用条件表达式来计算每个 id 仅在 30 天内有多少行。