【问题标题】:How to specify a query for COUNT?如何为 COUNT 指定查询?
【发布时间】:2014-12-16 14:18:29
【问题描述】:

我一直在寻找一些东西,但没有找到任何东西。我不是 100% 熟悉 SQL,但我想做的是:

SELECT TOP (SELECT COUNT (DISTINCT Name) 
            FROM Logg WHERE Id= 1) 
* FROM Logg WHERE Id= 1

换句话说,我想要一个查询,它首先计算具有不同“名称”的行数,然后选择给定计数的前 x 行。

我将如何构建这样的查询?

【问题讨论】:

  • 您能否编辑您的问题并提供示例数据和所需的结果?
  • 你想要名字的计数还是最高计数的名字?

标签: sql sql-server sql-server-2008 tsql select


【解决方案1】:

只需将查询分成 3 个部分:

DECLARE @cnt INT
SELECT @cnt = COUNT (DISTINCT TestNamn) FROM SelfTestLogg WHERE ApplikationId = 1
SELECT TOP (@cnt) * FROM SelfTestLogg WHERE ApplikationId = 1

【讨论】:

    【解决方案2】:

    您是否要选择只出现一次的所有名称?

    如果是这样:

    select name
    from logg
    where id = 1
    group by name
    having count(*) = 1;
    

    【讨论】:

      【解决方案3】:

      您的查询确实有效 - 您只需要指定一个列列表:

      SELECT TOP (SELECT COUNT (DISTINCT Name) FROM Logg WHERE Id= 1) * -- Need to specify columns
      FROM Logg WHERE Id= 1;
      

      SqlFiddle

      【讨论】:

      • 是的,嗨。抱歉,我忘记了 *,但我的查询中有它。不知道为什么它不起作用。
      • 使用列,您的查询适用于 Sql2008 + 2012 - 我已经更新了 SqlFiddle。可能您的过滤器Where id = 1 中的某些内容不包括数据?
      • 是的,这显然是本地问题。很抱歉耽误您的时间。
      • 根据@Gordon 的评论,您能否粘贴一些示例数据以及您需要的结果是什么?听起来您可能想要一个动态窗口函数或类似函数(假设您想要一个更通用的解决方案,而不仅仅是通过同一个过滤器对计数和#rows 进行硬过滤)
      【解决方案4】:
      SELECT TOP 1 * FROM Logg WHERE Id= 1
      

      【讨论】:

      • @user1531921 需要 TOP 值作为表达式,而不是文字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多