2013-07-10 4 views
1

Я хочу посчитать отправленные письма (главная таблица: ex_deliverylog) & их получателей (подробная таблица: ex_deliverylog) из журналов. В приведенном ниже запросе возвращаются одинаковые значения для [сеанса] и [получателей]. Короче говоря, я не мог группировать & count [сеанс].SQL: Групповая и учетная запись и данные

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 

Запрос & Результат:

enter image description here

Таблицы & поля:

enter image description here

Как я могу рассчитывать оба сеанса & их всего получателей?

ответ

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, и вы получите поведение, которое вы испытываете (то же самое, для обоих).

+0

Теперь это правильно ... –

1

В настоящее время вы получаете одинаковое значение для обоих, поскольку ваш запрос возвращает заданное количество строк для каждого GROUP BY, а для каждого оператора COUNT() все эти строки заполняются, поэтому вы получаете одинаковое значение в своем результаты подсчета по этим полям. Вы должны считать уникальными значениями этих идентификаторов. Меняем

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 

Если это не удовлетворяет ваши потребности, я бы рекомендовал отделяя Ваш подсчет сессий и количество получателей на отдельные запросы, которые вы чувствуете, у вас есть больше контроля над ,

+0

Теперь оба поля (сеанс и получатели) подсчитывают количество сеансов. –

+0

В этом случае вам нужно реорганизовать свой запрос, и похоже, что вы не полностью понимаете свой собственный запрос прямо сейчас, что означает, что вы не должны доверять результатам в любом случае. Я не знаю, на что ссылаются поля в этих таблицах, поэтому совет, который я могу вам дать, довольно ограничен. –

+0

@NimeCloud Вы присоединяетесь к доставкеID. Если в ex_deliverylog отсутствует идентификатор доставки, который не находится в ex_deliverylog_recipients, эти подсчеты будут одинаковыми. – Paparazzi

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 

Человек может получить ту же электронную почту более чем один раз.
E.G. отправлено в две группы, и лицо было в каждой группе.
Если вам нужно количество уникальных получателей затем 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 
+1

Возможно, вы должны * выделить * разницу между двумя запросами. Мне потребовалось некоторое время, чтобы понять это. ;-) –

0

SQL Server имеет приятный расширение SQL, чтобы сделать это.

Добавить «WITH ROLLUP» после вашего предложения GROUP BY, и он будет производить промежуточные итоги на каждом уровне GROUP BY.