根据客户ID计算电子邮件类型

时间:2012-01-23 16:09:25

标签: ms-access count group-by union having

我有一张表格供人们用来向我们的客户发送电子邮件。用户可以选择两个预设消息(消息“1”或消息“2”)。在幕后,每当他们点击“SEND”按钮时,它就会登录到“RECORDS”表(只要它通过错误处理程序)。

让我们假装RECORDS表有两列:

CUST_ID  EMAIL_NUM
0000         1
0000         2
0000         1
0000         1
0001         2
0002         1
0002         1
0003         2
0003         2
0003         2

我需要一个查询,计算每个CUST_ID的1和2。所以结果集看起来应该是这样的:

CUST_ID  EMAIL_1_COUNT  EMAIL_2_COUNT
0000          3              1
0001          0              1
0002          2              0
0003          0              3

我使用过count,group bys,havings,while,union,nested selection,但就像我说的那样,我可能会让一些相对简单的东西复杂化。

2 个答案:

答案 0 :(得分:4)

select
  CUST_ID,
  sum(iif(EMAIL_NUM = 1, 1, 0)) as EMAIL_1_COUNT,
  sum(iif(EMAIL_NUM = 2, 1, 0)) as EMAIL_2_COUNT
from
  RECORDS
group by
  CUST_ID

答案 1 :(得分:1)

要考虑的另一个选择是使用带有TRANSFORM的透视查询

TRANSFORM NZ(Count(RECORDS.Email_NUm),0) AS CountOfEmail_NUm
SELECT RECORDS.CUST_ID
FROM RECORDS
GROUP BY RECORDS.CUST_ID
PIVOT RECORDS.Email_NUm;

然而,这会生成CUST_ID12的列标题。但是,如果您有另一个包含电子邮件类型的表,那么它可能是值得的(特别是如果您有大量的电子邮件类型而不是2)

SQL可能看起来像这样

TRANSFORM NZ(Count(r.Email_NUm),0) AS CountOfEmail_NUm
SELECT r.CUST_ID
FROM RECORDS r
     INNER JOIN EMAIL_TYPES et
     ON r.Email_NUm = et.Email_NUm
GROUP BY r.CUST_ID
PIVOT et.TYPE_NAME;

制作此输出

   CUST_ID | Work | Home 
   -------   ----   ----
   0000    | 3    | 1
   0001    | 0    | 1
   0002    | 2    | 0
   0003    | 0    | 3