以不同方式统计客户 - 我需要子查询吗?

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,我还没有尝试过您的解决方案,但会试一试。您所做的事情非常有趣,即将表格连接到自身,我没有意识到您可以这样做。

以上是关于以不同方式统计客户 - 我需要子查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

需要子查询帮助

SQL计算查询

oracle分页查询,一个select语句解决,不需要子查询。

Mysql子查询优化?

SQL查询以选择在同一列中具有不同值的子记录的父级

mysql的子查询中有统计语句 我该如何优化