使用MSSQL服务器查询返回每个库的图像计数时遇到问题

使用MSSQL服务器查询返回每个库的图像计数时遇到问题,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我目前正在尝试将另一列(PictureCount)添加到结果集中,该列返回位于另一个表的每个唯一库中的图像计数。(GalleryID将它们链接在一起。)每个GalleryID可以有3到20个MediaID与它们关联 我不是SQL方面的专家,所以我需要一些帮助。我甚至不确定是否有可能返回我正在寻找的计数 谢谢 SQL FIDLE可帮助您: 这是我当前的查询,它返回我所需要的所有内容,除了一个计数列,我不知道该怎么做 WITH CTE AS ( SELECT a.GalleryTitle,

我目前正在尝试将另一列(PictureCount)添加到结果集中,该列返回位于另一个表的每个唯一库中的图像计数。(GalleryID将它们链接在一起。)每个GalleryID可以有3到20个MediaID与它们关联

我不是SQL方面的专家,所以我需要一些帮助。我甚至不确定是否有可能返回我正在寻找的计数

谢谢

SQL FIDLE可帮助您:

这是我当前的查询,它返回我所需要的所有内容,除了一个计数列,我不知道该怎么做

WITH CTE AS (
    SELECT a.GalleryTitle, a.GalleryDate, b.*,  
    ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
    ORDER BY b.MediaThumb DESC) AS Rn
    FROM Media b
    INNER JOIN Galleries A
    ON a.GalleryID = b.GalleryID
    WHERE b.IsPlug = 0 AND b.IsHidden = 0
),

CTE2 AS
(
    SELECT a.GalleryTitle, a.GalleryDate, b.*,  
    1 Rn
    FROM Media b
    LEFT OUTER JOIN Galleries A
    ON a.GalleryID = b.GalleryID
)

SELECT *, NewID = NEWID() FROM CTE WHERE rn = 1 and MediaTypeID = 4

UNION ALL

SELECT *, NewID = NEWID() FROM CTE2 WHERE rn = 1 and MediaTypeID = 4 and GalleryID is NULL
ORDER BY GalleryDate DESC, GalleryID DESC
这应该起作用:

WITH cte As
(
   SELECT
      a.GalleryID As GalleryID_A,
      a.GalleryTitle,
      a.GalleryDate,
      b.*,

      -- You only need to partition by GalleryID:
      ROW_NUMBER() OVER (PARTITION BY b.GalleryID ORDER BY b.MediaThumb DESC) As Rn,

      -- This will return the number of media records per gallery:
      COUNT(1) OVER (PARTITION BY b.GalleryID) As Rc
   FROM
      Media As b
      -- The LEFT JOIN will include media with no gallery,
      -- so your second CTE is not needed:
      LEFT JOIN Gallery As A
      ON b.GalleryID = A.GalleryID
   WHERE
      -- This filter needs to be within the CTE,
      -- otherwise you'll exclude galleries where the last
      -- media is not type 4:
      b.MediaTypeID = 4
)
SELECT
   *
FROM
   cte
WHERE
   rn = 1
ORDER BY 
   GalleryDate DESC, 
   GalleryID DESC
;
这应该起作用:

WITH cte As
(
   SELECT
      a.GalleryID As GalleryID_A,
      a.GalleryTitle,
      a.GalleryDate,
      b.*,

      -- You only need to partition by GalleryID:
      ROW_NUMBER() OVER (PARTITION BY b.GalleryID ORDER BY b.MediaThumb DESC) As Rn,

      -- This will return the number of media records per gallery:
      COUNT(1) OVER (PARTITION BY b.GalleryID) As Rc
   FROM
      Media As b
      -- The LEFT JOIN will include media with no gallery,
      -- so your second CTE is not needed:
      LEFT JOIN Gallery As A
      ON b.GalleryID = A.GalleryID
   WHERE
      -- This filter needs to be within the CTE,
      -- otherwise you'll exclude galleries where the last
      -- media is not type 4:
      b.MediaTypeID = 4
)
SELECT
   *
FROM
   cte
WHERE
   rn = 1
ORDER BY 
   GalleryDate DESC, 
   GalleryID DESC
;

哇,谢谢Richard的快速回答和完美的答案。亲切的问候!哇,谢谢Richard的快速回答和完美的答案。亲切的问候!