【问题标题】:Select and Count in small SQL Server query在小型 SQL Server 查询中选择和计数
【发布时间】:2014-10-21 01:47:35
【问题描述】:

我有一个只有两列的表,用于将 cmets 分配给图像。

第一列包含图片 ID,第二列包含相关评论 ID。一个图像可以有多个 cmets,但每个 cmets 都有一个唯一的评论 ID。

基于此,我希望根据每张图像的 cmets 数量按降序排列,因此 cmets 最多的图像应显示在顶部。

我尝试了以下方法,但 SQL 不接受 Distinct 和 XML 的组合。在这里使用 Distinct 的想法是消除重复,因为我只希望 每个图像在结果中出现一次

我怎样才能做到这一点?

我的 SQL:

BEGIN

    SET NOCOUNT ON;

    SELECT DISTINCT     Top 20 A.imgID,
                COUNT(*) OVER() AS volume,
                (
                    SELECT      B.commentID,
                                COUNT(*) OVER() AS volume
                    FROM        MOC_ImgComments B
                    WHERE       B.imgID = A.imgID
                    FOR XML PATH(''), ELEMENTS, TYPE
                )
    FROM        MOC_ImgComments A
    ORDER BY    volume desc, A.imgID
    FOR XML PATH('images'), ELEMENTS, TYPE, ROOT('ranks')   

END

【问题讨论】:

  • 您需要通过 a.imgID 添加一个组到您的主查询。您可能还想在子查询中添加 order by 来控制顺序。
  • 谢谢!关于子查询,我想我可以跳过 Order By,因为我只需要那里的音量。对于主要查询,我只需要按 img ID 分组就可以了吗?

标签: sql sql-server select count distinct


【解决方案1】:

请尝试使用 GROUP BY 子句。我没有测试过下面的代码。

BEGIN

SET NOCOUNT ON;

SELECT    Top 20 A.imgID,
            COUNT(*) OVER() AS volume,
            (
                SELECT      B.commentID,
                            COUNT(*) OVER() AS volume
                FROM        MOC_ImgComments B
                WHERE       B.imgID = A.imgID
                FOR XML PATH(''), ELEMENTS, TYPE
            )
FROM        MOC_ImgComments A
ORDER BY    volume desc, A.imgID
FOR XML PATH('images'), ELEMENTS, TYPE, ROOT('ranks')   
group by A.imgID
END

【讨论】:

  • 谢谢。这给了我正确的结果(当从主查询中删除计数并将组移动到 xml 行上方但我无法让它按子查询的音量降序排序。
猜你喜欢
  • 1970-01-01
  • 2018-03-04
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多