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