我想将下面的两个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
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天内有多少行。