代码之家  ›  专栏  ›  技术社区  ›  Peter Ajtai

如何在SQL中使用变量或引用?

  •  1
  • Peter Ajtai  · 技术社区  · 14 年前

    the following :
    ( 在上运行查询 Stack Exchange Data Explorer ,它使用OData的sqlazure实现。这个 FAQ TSQL公司 ):

    DECLARE @MinPosts int = ##MinNumberOfPosts##
    SELECT
        Id AS [User Link],
        Reputation,
        (SELECT COUNT(*)
        FROM posts
        WHERE posts.OwnerUserId = Users.Id
        ) AS [# Posts],
        Reputation /
        (SELECT COUNT(*)
        FROM posts
        WHERE posts.OwnerUserId = Users.Id
        ) AS [Rep Per Post]
    FROM Users
    WHERE (SELECT COUNT(*)
        FROM posts
        WHERE posts.OwnerUserId = Users.Id
        ) > @MinPosts
    ORDER BY [Rep Per Post] DESC
    

    我写下:

    (SELECT COUNT(*)
    FROM posts
    WHERE posts.OwnerUserId = Users.Id)
    

    三次。 ?

    我试过使用列别名 [# Posts]

    我发现 these posts

    2 回复  |  直到 7 年前
        1
  •  3
  •   momo    14 年前

    因为您需要整个数据库中每个用户以及每个帖子的计数,所以只需以简单的方式进行:

    SELECT
        Id AS [User Link],
        Reputation,
        Reputation * 1.0 / C.Cnt AS [Rep Per Post]
    FROM
       Users U
       INNER JOIN (
          SELECT OwnerUserId, Cnt = Count(*)
          FROM posts
          GROUP BY OwnerUserID
          HAVING Count(*) >= ##MinNumberOfPosts##
       ) C ON U.Id = C.OwnerUserId
    ORDER BY [Rep Per Post] DESC
    

    我补充道 * 1.0 因为我猜(不确定这里的引擎)整数除法产生整数,看起来你可能想要分数。你得做个实验。

        2
  •  1
  •   jasonpenny    14 年前

    你可以用 CROSS APPLY

    DECLARE @MinPosts int = ##MinNumberOfPosts##
    
    SELECT
        Id AS [User Link],
        Reputation,
        counts.[# Posts],
        Reputation / counts.[# Posts] AS [Rep Per Post]
    FROM Users
      CROSS APPLY (
        SELECT COUNT(*)
        FROM posts
        WHERE posts.OwnerUserId = Users.Id
      ) counts([# Posts])
    WHERE counts.[# Posts] > @MinPosts
    ORDER BY [Rep Per Post] DESC​