【问题标题】:How to get a proper count in sql server when retrieving a lot of fields?检索大量字段时如何在sql server中获得正确的计数?
【发布时间】:2009-03-03 21:46:15
【问题描述】:

这是我的场景,

我有一个返回很多字段的查询。其中一个字段称为 ID,我想按 ID 分组并按降序显示计数。但是,由于我要带回更多字段,因此很难显示真实计数,因为我必须按其他字段进行分组。这是我正在尝试做的一个例子。如果我只有 2 个字段(ID、颜色)并按颜色分组,我可能会得到这样的结果:

ID 颜色计数

== ===== =====

2    红色    10

3    蓝色    5

4    绿色  24

假设我添加了另一个字段,实际上是同一个人,但他们的名字拼写不同,这会导致计数失败,所以我可能会有这样的事情:

ID 颜色名称计数

== ===== ====== =====

2    红色    吉姆      5

2    红色    吉米      5

3    红色    鲍勃      3

3    红色    罗伯特      2

4    红色    约翰尼      12

4    红色    约翰      12

我希望能够恢复 ID、颜色、名称和计数,但会像第一个表一样显示计数。有没有办法使用 ID 做到这一点?

【问题讨论】:

  • 这对我来说没有意义,你想在 ID 2 的两条线上都显示“10”吗?这真的需要一个查询吗?
  • 是的,我很好奇是否可以只按 ID 分组并显示 10 的计数,而不必按所有选定的列进行分组

标签: sql sql-server tsql


【解决方案1】:

如果您想要单个结果集,则必须省略名称,就像在您的第一篇文章中一样

SELECT Id, Color, COUNT(*)
FROM YourTable
GROUP By Id, Color

现在,您可以通过子查询获得您想要的功能,虽然并不优雅

SELECT Id, Color Name, (SELECT COUNT(*) 
                        FROM YourTable 
                        Where Id = O.Id 
                            AND Color = O.Color
                       ) AS "Count"
FROM YourTable O
GROUP BY Id, Color, Name

这应该如你所愿

【讨论】:

  • 没有聚合应用到外部选择中的最后一列?
  • 你可以这样做,但不是必须的,因为无论如何它只会返回 1 条记录。
【解决方案2】:

试试这个:-

 SELECT DISTINCT a.ID, a.Color, a.Name, b.Count
 FROM yourTable
 INNER JOIN (
     SELECT ID, Color, Count(1) [Count] FROM yourTable
     GROUP BY ID, Color
 ) b ON a.ID = b.ID, a.Color = b.Color
 ORDER BY [Count] DESC

【讨论】:

    【解决方案3】:

    尝试进行子查询以获取计数。

    -- 马库斯Q

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多