【问题标题】:MS Access Group By number of distinct items in columnMS Access Group By 列中不同项目的数量
【发布时间】:2014-07-18 15:05:18
【问题描述】:

我在下面有这张表:

AgentCode | Status 
-----------------------
Agent1    | Registered
Agent1    | Rejected
Agent2    | Registered

我需要编写一个 MS Access 查询来获得这个输出:

AgentCode | Registered | Rejected | Total
-----------------------------------------
Agent1    | 1          | 1        | 2
Agent2    | 1          | 0        | 1

我知道 GROUP BY 语句应该这样做,但不知何故我在尝试编写查询本身时迷失了方向。

提前感谢您的帮助。

【问题讨论】:

  • GROUP BY 不会那样做。你想要一个交叉表查询。
  • 我刚刚尝试了交叉表查询,它确实返回了 AgentCode 和特定 AgentCode 下的项目总数。但是您知道我如何将总数(每个状态)划分为上面的示例吗?

标签: sql ms-access vba ms-access-2003


【解决方案1】:

试试这个:

SELECT AgentCode
    ,SUM(IFF(Status='Registered',1,0)) as Registered
    ,SUM(IFF(Status='Rejected',1,0)) as Rejected
    ,Count(Status) as Total
FROM table
GROUP BY AgentCode

【讨论】:

  • 刚刚将上面帖子中的“IFF”更改为“IIF”。除此之外,它真的很棒。非常感谢! :)
【解决方案2】:

您可以同时使用 GROUP BY 查询(如 Dimitris 所示):

SELECT
  AgentCode,
  SUM(IIF(Status='Registered',1,0)) AS Registered,
  SUM(IIF(Status='Rejected'  ,1,0)) AS Rejected,
  COUNT(  Status                  ) AS Total
FROM table
GROUP BY AgentCode

...或使用 CROSSTAB 查询,如下所示:

TRANSFORM COUNT(Status) 
SELECT AgentCode, Count(Status) AS Total
FROM table
GROUP BY AgentCode
PIVOT Status

不过还是有区别的。

  1. 静态 vs 动态 - GROUP BY 查询是静态的,而 CROSSTAB 查询是动态的。这意味着,如果您开始使用不同的状态,或者您使用 where 进行过滤并且状态较少,则前者不会调整列,而后者会。
  2. 可移植性 - GROUP BY 查询与您可以在大多数 RDBMS 上执行的操作非常相似(除了 IIF 功能,在其他 RDBMS 中必须用 CASE WHEN 代替)。 CROSSTAB 查询不是很标准。它在许多 RDBMS 上实现,但语法大不相同。

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多