SQL Server:在一个查询中来自同一表的多个选择语句

时间:2019-03-21 18:59:57

标签: sql-server join count

我正在处理两个查询,这些查询从一个表中提取数据。我可以让它们按照自己的意愿运行,但是如果可能的话,我希望将它们组合成一个。我已经在[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

2 个答案:

答案 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,然后交叉联接。

两个查询都只返回一个单元格结果,因此这里不需要花哨。