我有一张表格供人们用来向我们的客户发送电子邮件。用户可以选择两个预设消息(消息“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,但就像我说的那样,我可能会让一些相对简单的东西复杂化。
答案 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_ID
,1
和2
的列标题。但是,如果您有另一个包含电子邮件类型的表,那么它可能是值得的(特别是如果您有大量的电子邮件类型而不是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