1

I want to count mails sent (master table: ex_deliverylog) & their recipients (details table: ex_deliverylog) from logs. The query below returns same values for both [session] and [recipients]. In short I couldn't group & count [session].

    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

Query & result:

enter image description here

Tables & fields:

enter image description here

How can I count both sessions & their total recipients?

4

4 に答える 4

1

現在、クエリは各 に対して設定された行数を返し、GROUP BYCOUNT()ステートメントに対してそれらの行のすべてが入力されているため、両方に対して同じ値を取得しているため、これらのフィールドをカウントする結果で同じ値を受け取っています。これらの 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

あなたがやろうとしていることを理解していれば、デフォルトの whichCOUNT DISTINCTではなく、セッションのカウントで使用する必要があると思います:COUNTCOUNT 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

そうすれば、セッション数は個別のセッションの数を反映し、受信者の数は個別の受信者の数を反映します。どちらも指定されていない場合ALLDISTINCTデフォルトはCOUNTALLなり、発生している動作が得られます (つまり、両方のカウントが同じです)。

于 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

1 人が同じメールを複数回受信することがあります。
EGは2つのグループに送られ、その人はそれぞれのグループにいました。
一意の受信者の数が必要な場合は、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 に答える