2015-12-18 54 views
1

我很难弄清楚如何才能跳出查询,该查询使我知道有多少人已收到特定广告系列中的字母数。 像 输出:SQL选择到多个计数(*)输出

我写
Number of sent emails received    Number of client ID-s 
     0         20145 
     1         1244 
     2         123 
     etc..        etc.. 

当前SQL从我需要得到信息的所有表得到的所有数据。

SELECT 
account.EXT_STRING0 as client_ID, 
account.EXT_STRING2 as Email, 
activity.TEMPLATE_NAME as Template_name, 
activity.NAME as campaign_name, 
activity.EXECUTION_ID, -- unique campaign sent mail id 
activity.SEND_DATE, 
Activity.OPEN_DATE, 
Activity.CLICK_DATE 
FROM 
    crmautomation.oocke1_account account 
Join 
    crmautomation.oocke1_activity activity 
    ON 
    (account.object_id = activity.rep_contact) 
left JOIN 
    crmautomation.OBJ_VAL val1 
     ON val1.obj_row_id = activity.CAMPAIGN_TYPE AND (val1.OBJ_VAL_ID in(4250950)) 
left JOIN 
    crmautomation.OBJ_VAL val2 
     ON val2.obj_row_id = activity.CAMPAIGN_TYPE AND (val2.OBJ_VAL_ID in(4250951)) 
where activity.TEMPLATE_NAME= ('cabin_surprise_ne') 
and activity.SEND_DATE >('2015.12.01') 

我以为我可以使用Group by来获得电子邮件数(*) - s,但我不知道该怎么做。

编辑: 下面是这个SQL

client_ID Email    template_name  Execution_ID  Send_date 
'343205' [email protected] Cabin_surprise_ne 0032-1fdsa-31 2015-12-14 23:08  

的输出与此邮件尚未打开

+1

请邮寄样本输入和输出 – mohan111

+0

标签DBMS请 – pedram

+0

除了'组by'你需要'COUNT(*)'添加到您的选择条款。这是非常基本的SQL。既然你不知道,我已经听说过这本书的好处,在10分钟内教你自己的SQL。 –

回答

1

一种方式来构建您的查询是:

with cte as (
     <your query here> 
    ) 
select cnt, count(*) as numClients, min(client_id), max(client_id) 
from (select client_id, count(activity.rep_contact) as cnt 
     from cte 
     group by client_id 
    ) x 
group by cnt 
order by cnt; 

这是一个“直方图直方图”查询,您试图获取计数。

编辑:

仔细观察,你不会得到零数,因为where条款撤消left join。所以,查询可能看起来像:

SELECT cnt, count(*) 
FROM (SELECT acc.EXT_STRING0 as client_ID, COUNT(a.rep_code) as cnt 
     FROM crmautomation.oocke1_account acc left Join 
      crmautomation.oocke1_activity a 
      ON acc.object_id = a.rep_contact and 
       a.TEMPLATE_NAME = 'cabin_surprise_ne' 
       a.SEND_DATE > '2015.12.01' left JOIN 
      crmautomation.OBJ_VAL val1 
      ON val1.obj_row_id = a.CAMPAIGN_TYPE AND (val1.OBJ_VAL_ID in (4250950)) left JOIN 
      crmautomation.OBJ_VAL val2 
      ON val2.obj_row_id = a.CAMPAIGN_TYPE AND (val2.OBJ_VAL_ID in (4250951)) 
     GROUP BY acc.EXT_STRING0 
    ) a 
GROUP BY cnt 
ORDER BY cnt; 

我仍然不完全理解查询。对于未使用的表,您有两个left join。这些可能会被删除,但是您不能提供有关您问题中数据结构的足够信息。

+0

好吧我会尽力弄清楚,并在周末后回来更多的信息,但迄今为止感谢您。 – N2hvits

0
select count(*) count2, sum(a.count) 
(
SELECT 
    count(*) as count, 
    account.EXT_STRING0 AS client_ID, 
    account.EXT_STRING2 AS Email, 
    activity.TEMPLATE_NAME AS Template_name, 
    activity.NAME AS campaign_name, 
    activity.EXECUTION_ID, 
    activity.SEND_DATE, 
    Activity.OPEN_DATE, 
    Activity.CLICK_DATE 
FROM 
    crmautomation.oocke1_account account 
     JOIN 
    crmautomation.oocke1_activity activity ON (account.object_id = activity.rep_contact) 
     LEFT JOIN 
    crmautomation.OBJ_VAL val1 ON val1.obj_row_id = activity.CAMPAIGN_TYPE 
     AND (val1.OBJ_VAL_ID IN (4250950)) 
     LEFT JOIN 
    crmautomation.OBJ_VAL val2 ON val2.obj_row_id = activity.CAMPAIGN_TYPE 
     AND (val2.OBJ_VAL_ID IN (4250951)) 
WHERE 
    activity.TEMPLATE_NAME = ('cabin_surprise_ne') 
     AND activity.SEND_DATE > ('2015.12.01') 
    group by account.EXT_STRING0) a -- client_ID 
    group by account.EXT_STRING2 -- Email 
+0

虽然这可能会回答这个问题,但是任何发布的代码至少在最少量的解释下发布,对未来的读者来说可能不是很有用。 – Erik

+0

我对此表示歉意,对此仍然陌生。基本上在当前查询中,通过客户端ID添加一个计数和组,然后用另一个计数创建一个外部查询,但是这个时间组通过电子邮件...在外部查询中,您只选择前一个计数的总和。希望这是有道理的。 – 26itha

+0

您可以通过点击左下方的编辑按钮编辑您的答案,并添加该文本,我认为这已经提高了您的答案(比留下评论更好) – Erik