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

问题描述 投票:0回答:1

我想将下面的两个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
  -------------------------------------

第一个查询的每个都会给出格式id count_YY_days_or_less


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


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

[我希望有一个查询,如果可能的话,不带PIVOTING,但是如果旋转可以解决它,那也是可以接受的。

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

sql-server tsql group-by conditional-statements sql-server-2014
1个回答
1
投票
您可以进行条件聚合:

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天的数据进行过滤(请注意,我简化了代码,以免在表列上使用日期函数-这样效率更高)。然后,我们使用条件表达式来计算id仅在30天内有多少行。
© www.soinside.com 2019 - 2024. All rights reserved.