以不同方式统计客户 - 我需要子查询吗?
Posted
技术标签:
【中文标题】以不同方式统计客户 - 我需要子查询吗?【英文标题】:Counting Customers in different ways - Do I need a SubQuery? 【发布时间】:2012-01-07 14:21:48 【问题描述】:感谢您花时间阅读我的问题。
想象一下,如果客户开立账户,他们将获得一份免费礼物。一些“客户”开立账户以获得免费礼物,但从不向他们的账户充值。其他“客户”开立账户,获得免费礼物,并通过向其账户充值来为其账户充值。
我需要将资金账户与所有客户的总数进行比较。
一开始看起来很简单……
SELECT Audits.AuditDate, Count(Audits.NickName) AS AllAccounts
FROM Audits
Group By Audits.AuditDate
这显然给了我每天所有帐户的计数。
要获得“已资助”数,我会……
SELECT Audits.AuditDate, Count(Audits.NickName) AS Funded
FROM Audits
WHERE Audits.CurrGBP > 0
GROUP BY Audits.AuditDate;
这一次我得到了“资金”账户的数量。
现在,这就是我卡住的地方……我想要来自同一个查询的两个计数,所以我的结果会是这样的……
AuditDate (DD/MM/YYYY) AllAccounts Funded
01/01/2012 50 45
02/01/2012 60 50
03/01/2012 70 55
有些东西告诉我我需要使用子查询,但在谷歌搜索了几页之后。子查询让我感到困惑。
请问我可以寻求帮助吗?你能告诉我如何编写一个子查询来给我我需要的结果吗?
问候, 约翰。
PS - 我的 Audits 表包含以下字段:Audit_ID、Audit_Date、NickName、CurrGBP,我使用的是 MS Access 2010。
【问题讨论】:
+1 以获得非常好的文章解释并提供了很好的细节。一个“经过深思熟虑和解释的问题” 【参考方案1】:不记得访问是否支持大小写;或者如果 IIF 是要走的路……但类似……
实际上并不需要子查询,您可以在一个查询中获得结果,只需在使用案例或 IIF 时限制您的计数。
Select A.AuditDate,
count (A.NickName) as AllAccounts,
sum(CASE when A.CurrGBP > 0 then 1 else 0 end) as Funded
FROM Audits A
GROUP BY A.AuditDate
如果 IIF
Select A.AuditDate,
count (A.NickName) as AllAccounts,
sum(IIF(A.CurrGBP >0,1,0)) as Funded
FROM Audits A
GROUP BY A.AuditDate
编辑,在选择中缺少一些逗号。
【讨论】:
谢谢。 CASE 示例不起作用,但 IIF 可以。当我为问题简化表格字段时,我需要对此进行更多调查......实际上,我还有另外 2 个字段(CurrUSD 和 CurrEUR)需要包含在您的 SUM() 中,但这肯定有帮助。 +1,约翰尼,“交叉表查询”功能也值得一看;特别是如果您正在处理多个列,这些列可以通过查询设计器构建,并且与 Excel 数据透视表的概念相同。 @Johnny:如果您想计算以任何支持的货币资助的账户,只需像这样扩展IIF
条件:IIF( CurrGBP > 0 OR CurrUSD > 0 OR ...)
。如果您的主要目标是计算不为空的帐户,那我认为就足够了。
@ xQBert - 使用 IIF 语句更接近我的需要。这似乎几乎给了我我需要的一切......选择 A.AuditDate, count (A.NickName) as AllAccounts, sum(IIF(A.CurrGBP > 0, 1, IIF(A.CurrUSD > 0, 1, IIF (A.CurrEUR > 0, 1, 0)))) as Funded from Audits A GROUP BY A.AuditDate
@Andriy M - 非常棒 - 比我的嵌套 IIF 更简单、更优雅。谢谢。【参考方案2】:
试试这个:
SELECT AuditA.AuditDate,
Count(AuditA.AllAcounts) as AllAccount,
iTable.iCount
FROM Audits as AuditA
INNER JOIN
(SELECT AuditB.Audit_ID, COUNT(AuditB.Audit_ID) as iCount
FROM Audit as AuditB
WHERE AuditB.CurrGBP > 0) as iTable
ON AuditA.Audit_ID = iTable.Audit_ID
【讨论】:
谢谢 johntotetwoo,我还没有尝试过您的解决方案,但会试一试。您所做的事情非常有趣,即将表格连接到自身,我没有意识到您可以这样做。以上是关于以不同方式统计客户 - 我需要子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章