【问题标题】:SQL Use DISTINCT inside a CASESQL 在 CASE 中使用 DISTINCT
【发布时间】:2016-04-07 10:59:21
【问题描述】:

我有以下疑问:

SELECT M.TYPE, COUNT(F.CD) AS TOTAL,
COUNT(CASE WHEN F.GENDER=0 THEN F.GENDER END) AS NUM_MALE,
COUNT(CASE WHEN F.GENDER=1 THEN F.GENDER END) AS NUM_FEMALE
FROM MARC M
LEFT JOIN FUNCION F ON M.CD_FUNCION = F.CD
GROUP BY 1  

即使 FUNCION 在 MARC 表中有几行,此查询也会按 TYPE 返回所有计数。但如果我只想要 DISTINCT FUNCIONS 我该怎么做?第一个计数很容易,但我如何使用 DISTINCT 来区分男性和女性?

提前致谢!

【问题讨论】:

  • 添加一些示例表数据、当前结果和预期结果。
  • SELECT COUNT(DiSTINCT F.CD)... 但这取决于。例如。 MS Access 不支持
  • jarlh:我希望它对 Total 结果进行 DISTINCT 以删除重复值,但我希望 DISTINCT 也适用于以下计数! StanislavL:是的,在第一个计数中,我可以像那样使用 DISTINCT……问题在于其他两个计数!

标签: sql count distinct


【解决方案1】:

您可以将COUNT DISTINCT 与条件聚合一起使用:

SELECT M.TYPE, COUNT(DISTINCT F.CD) AS TOTAL,
       COUNT(DISTINCT CASE WHEN F.GENDER = 0 THEN F.CD END) AS NUM_MALE,
       COUNT(DISTINCT CASE WHEN F.GENDER = 1 THEN F.CD END) AS NUM_FEMALE
FROM MARC M LEFT JOIN
     FUNCION F
     ON M.CD_FUNCION = F.CD
GROUP BY M.TYPE;

【讨论】:

  • 你告诉我的,例如MS Access 不支持 COUNT(DISTINCT) 和建议的替代方式:)。
  • @StanislavL,OP 没有说这是一个 MS Access 问题。
  • @jarlh 提供的解决方案在常见情况下不起作用。这取决于使用的数据库。戈登提供了另一种方法来做到这一点,并且可以将这种方式添加到答案中。
  • @StanislavL,这里 Gordon 的查询符合 ANSI SQL,并且在常见情况下工作得非常好。 MS Access 有一些限制,但这不是将 Access 特定答案作为一般的、独立于数据库的答案的理由。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多