【问题标题】:SQL pagination and count for duplicate rowsSQL分页和重复行计数
【发布时间】:2015-03-09 09:33:11
【问题描述】:

当我选择查询时,输出将如下所示

EmpID EmpCode Empname 日期 ID ClrID ClrName 状态 100 EMP01 Raj 2014 年 7 月 31 日 2 60 清除 0 100 EMP01 Raj 2014 年 7 月 31 日 3 61 测试 2 0 101 EMP02 基诺 2014 年 8 月 10 日 4 63 测试 3 0 102 EMP03 里根 2014 年 7 月 30 日 5 68 测试 4 1 102 EMP03 里根 2014 年 7 月 30 日 6 113 测试 5 1 102 EMP03 里根 2014 年 7 月 30 日 7 114 测试6 0 103 EMP04 拉杰什 2014 年 5 月 27 日 8 115 测试7 0

但我想要下面的输出和分页

TotalCount RowNum RowNumber1 EmpID EmpCode Empname 日期 ID ClrID ClrName 状态 4 1 1 100 EMP01 Raj 2014 年 7 月 31 日 2 60 清除 0 4 1 2 100 EMP01 拉吉 2014 年 7 月 31 日 3 61 测试 2 0 4 2 3 101 EMP02 基诺 2014 年 8 月 10 日 4 63 测试 3 0 4 3 4 102 EMP03 里根 2014 年 7 月 30 日 5 68 测试 4 1 4 3 5 102 EMP03 里根 2014 年 7 月 30 日 6 113 测试 5 1 4 3 6 102 EMP03 里根 2014 年 7 月 30 日 7 114 测试6 0 4 4 7 103 EMP04 拉杰什 2014 年 5 月 27 日 8 115 测试7 0

【问题讨论】:

  • 你使用什么数据库引擎?
  • TotalCount 代表什么?和罗纳姆?你应该更好地解释你的问题。
  • Microsoft SQL server 和 TotalCount 表示有多少行没有重复的 EmpID 值

标签: sql sql-server pagination


【解决方案1】:

您可以在某些数据库中使用窗口/分析函数执行此操作:

select count(distinct empid) over () as TotalCount,
       dense_rank() over (order by empid) as RowNumber,
       row_number() over (order by empid) as RowNumber1,
       t.*
from table t;

请注意,即使某些支持窗口函数的数据库也不支持count(distinct)。然而,有些人这样做。您使用的数据库对此类查询有很大影响。

请注意:窗口函数是 ANSI 标准功能,尽管并非所有数据库都支持它们。

编辑:

这是在 SQL Server 上执行count(distinct) 的技巧:

select sum(case when empidrownum = 1 then 1 else 0 end) over () as TotalCount,
       dense_rank() over (order by empid) as RowNumber,
       row_number() over (order by empid) as RowNumber1,
       t.*
from (select t.*,
             row_number() over (partition by empid order by empid) as empidrownum
      from table t
     ) t

【讨论】:

  • SQL Server 2008 抱怨将 distinctover 一起使用。
【解决方案2】:

您可以使用 dense_rank() 和 row_number() 方法来获得此输出。 我认为您需要此输出来创建动态表。

【讨论】:

    【解决方案3】:

    仅限 MySQL 的解决方案

    select count(distinct empid) as totalcount, 
           @empnum := case when @empnum <> empid then @empnum + 1 else @empnum end as rownum,
           @row := @row + 1 as rownumber1,
           *
    from your_table
    cross join (select @empnum := 0) e
    cross join (select @row := 0) r
    order by id
    

    【讨论】:

      【解决方案4】:

      试试这个:

      select 
      (select count(distinct empid) from yourtable) TotalCount,
      dense_rank() over (order by empid) RowNum,
      rank() over (order by id) RowNumber1,
      *
      from yourtable
      

      这将适用于 SQL Server 2005 及更高版本以及 Oracle(不确定从哪个版本开始)。

      请注意,由于 SQL Server 在使用 distinctover 时会出错,而不是窗口函数,因此我使用子查询来获取 TotalCount

      【讨论】:

        【解决方案5】:

        应该这样做,它会GROUP BY EmpCode 然后加入主记录表,列顺序也应该和你的例子一样。

        select x.TotalCount, x.RowNum, ROW_NUMBER() OVER 
         (ORDER BY t.ID) AS RowNumber1, t.* from [table] t
        inner join 
        (select sum(*) as TotalCount, ROW_NUMBER() OVER 
         (ORDER BY EmpCode) AS RowNum, EmpCode from [table] 
        group by EmpCode) as x on x.EmpCode = t.EmpCode
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-27
          • 1970-01-01
          • 1970-01-01
          • 2017-08-19
          • 2021-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多