【问题标题】:SQL - Display when count > 1SQL - 当计数 > 1 时显示
【发布时间】:2015-11-25 16:02:05
【问题描述】:

我确定以下查询不正确。我有一个名为 KantechImages 的表,它包含大约 8500 行。我想显示姓名、ESRno、Dept 和 JobTitle,其中有人姓名出现超过 1 次。我的查询是:

SELECT     Name, COUNT(*) AS count, ESRno, JobTitle, Dept
FROM       dbo.KantechImages
GROUP BY   Name, ESRno, JobTitle, Dept
HAVING     (COUNT(*) > 1)

但它只显示 268 行,我知道这是不正确的。如果我将其编辑为 SELECT Name & Count,它会返回超过 500 行。

【问题讨论】:

  • SELECT COUNT(*) AS count, ESRno, JobTitle, Dept FROM dbo.KantechImages GROUP BY ESRno, JobTitle, Dept HAVING COUNT(*) > 1
  • 你确定吗?发布这两个查询。

标签: sql database sql-server-2008


【解决方案1】:

你可以用窗口函数做你想做的事:

select name, cnt, ESRno, JobTitle, Dept
from (select ki.*, count(*) over (partition by name) as cnt
      from dbo.KantechImages ki
     ) ki
where cnt > 1;

因为您想要原始行,所以外部select 中的group by 不合适。

【讨论】:

  • 你说没有被挪用,但不是两个查询都返回相同的结果吗?
  • 我认为您的外部查询应该包含group bydistinct,否则可能会产生重复的行。
  • @SQLPolice 。 . .目的似乎是获取名称重复的所有原始行。这就是这个查询的作用。
  • 是的,可能是......这可能是一个人事数据库,此表包含一个人的所有更改,他想要一个包含多个条目的所有人的所有更改的列表。
  • 已将此标记为正确,因为它给了我想要的东西 - 现在只需要了解窗口函数!
【解决方案2】:

您的查询看起来没问题。我认为问题出在您的数据上。可能您认为是相同的东西,它们不喜欢名称中的额外空格。或者名称和 ESRno 之间可能不匹配。

试试类似的东西

这应该返回相同的 +500 名称,但如果有些有多余的空格并出现重复,您可以按名称排序。

  SELECT Name, count(Name)
  FROM   dbo.KantechImages
  GROUP BY Name
  ORDER BY Name
  HAVING count(Name) > 1

这应该返回相同的 +500,因为我假设每个名称都有一个 ESRno,除非两个 ppl 具有相同的名称。在这种情况下,您应该在结果中获得更多行。

  SELECT Name, ESRno, Count(ESRno)
  FROM   dbo.KantechImages
  GROUP BY Name, ESRno
  ORDER BY Name, ESRno
  HAVING count(ESRno) > 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2018-01-12
    • 2015-02-19
    • 2015-06-25
    • 1970-01-01
    • 2014-05-07
    • 2013-05-08
    相关资源
    最近更新 更多