1

我想从日志中计算发送的邮件(主表:ex_deliverylog)及其收件人(详细信息表:ex_deliverylog)。下面的查询为 [session] 和 [recipients] 返回相同的值。简而言之,我无法对 [会话] 进行分组和计数。

    Select 
        deliveryaccount,
        DATEDIFF(d,deliverytime, getdate()) AS ago
        ,COUNT(ex_deliverylog.deliveryid) as session
        ,COUNT(ex_deliverylog_recipients.deliveryid) as recipients

        --,( select count(*) from ex_deliverylog_recipients where ex_deliverylog.deliveryid = ex_deliverylog_recipients.deliveryid )  

    from ex_deliverylog

    left join ex_deliverylog_recipients 
           on ex_deliverylog_recipients.deliveryid = ex_deliverylog.deliveryid


    group by
        deliveryaccount,
        DATEDIFF(d,deliverytime, getdate())


    order by ago, session desc

查询&结果:

在此处输入图像描述

表格和字段:

在此处输入图像描述

我如何计算两个会话及其总收件人?

4

4 回答 4

1

现在,您将获得相同的值,因为您的查询为 each 返回了一组行GROUP BY,并且对于每个COUNT()语句,所有这些行都已填充,因此您在计算这些字段的结果中收到相同的值。您需要计算这些 id 的唯一值。所以改变

Select 
    deliveryaccount,
    DATEDIFF(d,deliverytime, getdate()) AS ago
    ,COUNT(ex_deliverylog.deliveryid) as session
    ,COUNT(ex_deliverylog_recipients.deliveryid) as recipients

Select 
    deliveryaccount,
    DATEDIFF(d,deliverytime, getdate()) AS ago
    ,COUNT(distinct ex_deliverylog.deliveryid) as session
    ,COUNT(distinct ex_deliverylog_recipients.deliveryid) as recipients

如果这不能满足您的需求,我建议将您的会话数和收件人数分成单独的查询,您可以更好地控制这些查询。

于 2013-07-10T13:40:07.247 回答
1

如果我了解您要做什么,我认为您需要使用COUNT DISTINCT会话计数,而不仅仅是COUNT默认为COUNT ALL

SELECT 
        deliveryaccount,
        DATEDIFF(d,deliverytime, getdate()) AS ago
        ,COUNT(DISTINCT ex_deliverylog.deliveryid) as session
        ,COUNT(ex_deliverylog_recipients.deliveryid) as recipients
FROM ex_deliverylog
LEFT JOIN ex_deliverylog_recipients 
       ON ex_deliverylog_recipients.deliveryid = ex_deliverylog.deliveryid
GROUP BY
    deliveryaccount,
    DATEDIFF(d,deliverytime, getdate())
ORDER BY ago, session desc

这样,会话计数将反映不同会话的数量,而接收者计数将反映不同接收者的数量。当既没有ALL也没有DISTINCT指定时,COUNT默认为ALL并且您会得到您正在经历的行为(即,两者的计数相同)。

于 2013-07-10T13:48:52.190 回答
1

我如何计算两个会话及其总收件人?
需要统计 ex_deliverylog_recipients.deliveryrecipientid

SELECT 
        deliveryaccount
       ,DATEDIFF(d,deliverytime, getdate()) AS ago
       ,COUNT(DISTINCT ex_deliverylog.deliveryid) as session
       ,COUNT(DISTINCT ex_deliverylog_recipients.deliveryrecipientid) as recipients
FROM ex_deliverylog
LEFT JOIN ex_deliverylog_recipients 
       ON ex_deliverylog_recipients.deliveryid = ex_deliverylog.deliveryid
GROUP BY
    deliveryaccount,
    DATEDIFF(d,deliverytime, getdate())
ORDER BY ago, session desc

一个人可以多次收到同一封电子邮件。
EG 被分到两组,每个组都有人。
如果您需要唯一收件人的计数,那么 deliveryrecipientaddress (不是 deliveryrecipientid):

SELECT 
        deliveryaccount
       ,DATEDIFF(d,deliverytime, getdate()) AS ago
       ,COUNT(DISTINCT ex_deliverylog.deliveryid) as session
       ,COUNT(DISTINCT ex_deliverylog_recipients.deliveryrecipientaddress) as recipients
FROM ex_deliverylog
LEFT JOIN ex_deliverylog_recipients 
       ON ex_deliverylog_recipients.deliveryid = ex_deliverylog.deliveryid
GROUP BY
    deliveryaccount,
    DATEDIFF(d,deliverytime, getdate())
ORDER BY ago, session desc
于 2013-07-10T13:55:11.623 回答
0

SQL Server 有一个很好的 SQL 扩展来执行此操作。

WITH ROLLUP在您的子句后添加“ ” GROUP BY,它将在每个 GROUP BY 级别生成小计。

于 2013-07-10T15:15:51.043 回答