我正在处理两个查询,这些查询从一个表中提取数据。我可以让它们按照自己的意愿运行,但是如果可能的话,我希望将它们组合成一个。我已经在[Multiple COUNT SELECTS from the same table in one query中尝试了该解决方案,但无法弄清楚。以下是我正在从事的工作:
--goback 30 days start at midnight
declare @daysgoingback as int
set @daysgoingback = 90
declare @olderdate as datetime
set @olderdate = DATEADD(Day, -@daysgoingback, DATEDIFF(Day, 0, GetDate()))
--today at 11:59pm
declare @today as datetime
set @today = dateadd(ms, -3, (dateadd(day, +1, convert(varchar, GETDATE(), 101))))
print @today
--these are the two queries I'd like to combine:
select
avg(x.LogAlerts*1.0 / @daysgoingback) as 'Avg number of log alerts'
from
(select count(*) as LogAlerts
from message_log_table
where msg_timestamp between @olderdate and @today) X
select
avg(x.MessagesDeleted*1.0 / @daysgoingback) as 'Avg number of messages deleted'
from
(select count(*) as MessagesDeleted
from message_log_table
where msg_details like '%message deleted%'
and msg_timestamp between @olderdate and @today) X
答案 0 :(得分:2)
“ AVG”是一个聚合函数,用于平均多行。您的“ select count(*)”子查询总是返回恰好一行,因此您并未真正按预期使用AVG函数。
您可以像这样将两者结合起来:
select count(*) * 1.0 / @daysgoingback as 'Avg number of log alerts'
, count(case when msg_details like '%message deleted%' then 1 end) * 1.0 / @daysgoingback as 'Avg number of messages deleted'
from message_log_table
where msg_timestamp between @olderdate and @today;
答案 1 :(得分:1)
将每个查询放入CTE,然后交叉联接。
两个查询都只返回一个单元格结果,因此这里不需要花哨。