【问题标题】:SQL Server 2005 - Select top N plus "Other"SQL Server 2005 - 选择前 N 个加“其他”
【发布时间】:2008-12-12 21:59:25
【问题描述】:

我有一个表格,我想在 A 列中选择前 5 行。我还希望有一个标题为“其他”的第 6 行,它将 A 列中除前 5 行之外的所有值相加。

有没有简单的方法来做到这一点?我开始:

select top 5 
    columnB, columnA 
from 
    someTable t
order by
    columnA desc

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    未测试,但请尝试以下方法:

    select * from (
        select top 5 
            columnB, columnA 
        from 
            someTable t
        order by
            columnA desc
        union all
        select 
            null, sum(columnA) 
        from 
            someTable t
        where primaryKey not in   (
            select top 5 
                primaryKey
            from 
                someTable t
            order by
                columnA desc
        )  
    ) a
    

    【讨论】:

    • 注意:我明确没有对 columnB 求和,因为您没有要求。
    【解决方案2】:
    select top 5 columnB, columnA
    from someTable 
    order by columnA desc
    
    select SUM(columnA) as Total
    from someTable
    

    在客户端做减法。

    【讨论】:

      【解决方案3】:

      100% 未经测试,我想不到,但你可以试试这样的东西。如果今晚我有机会测试,我会更新帖子,但是晚餐有瓶酒,现在是星期五晚上......:)

      WITH CTE AS
           (
           SELECT
                ColumnB,
                ColumnA,
                ROW_NUMBER() OVER (ORDER BY ColumnB) AS RowNumber
           FROM
                dbo.SomeTable
           )
       SELECT
            CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END AS ColumnB,
            SUM(ColumnA) AS ColumnA
       FROM
            CTE
       GROUP BY
            CASE WHEN RowNumber <= 5 THEN ColumnB ELSE 'Other' END
       ORDER BY
            MIN(RowNumber)
      

      编辑:看起来这在几个愚蠢的语法错误之后有效。我已经更正了这些,所以它现在应该像上面列出的那样工作。虽然我不能谈论大型数据集的性能,但值得一试。

      【讨论】:

        【解决方案4】:

        这不是我的想法,我会保证非常高效:

        SELECT TOP 5 columnB, columnA
        FROM comTable t
        ORDER BY columnA desc
        
        UNION
        
        SELECT 'Other', (A.Sum - B.Sum) AS Summary
        FROM (SELECT SUM(columnA) FROM someTable) A
        JOIN (SELECT SUM(One) FROM 
            (SELECT TOP 5 columnA FROM someTable ORDER BY columnA DESC)) B
        

        【讨论】:

          【解决方案5】:

          我最近经常使用 EXCEPT statemnet:(未测试但我试一试)

          select top 5 
              columnB, columnA 
          from 
              someTable t
          order by
              columnA desc
          UNION ALL
          SELECT 'OTHER' ColumnB, SUM(ColumnA)
          FROM
          (SELECT ColumnB, ColumnA 
          FROM someTable t
          EXCEPT
          select top 5 
              columnB, columnA 
          from 
              someTable t
          order by
              columnA desc
          ) others
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-15
            • 2019-10-26
            • 1970-01-01
            • 2011-02-05
            • 1970-01-01
            • 2021-07-11
            • 2013-07-08
            • 1970-01-01
            相关资源
            最近更新 更多