Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 特定列的行数,并与最后一行一起显示_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 特定列的行数,并与最后一行一起显示

Sql server 特定列的行数,并与最后一行一起显示,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我必须对一列中相同值的行进行计数,并显示最后一列的计数值。下面是我的情景 表1 Col_A Col_B Col_C a 1 a1 a 2 a2 a 3 a3 a 4 a4 a 5 a5 a 6 a6 b 7 a7 b 8 a8 b 9 a9 b 10 a10 e 7

我必须对一列中相同值的行进行计数,并显示最后一列的计数值。下面是我的情景

表1

Col_A Col_B Col_C a 1 a1 a 2 a2 a 3 a3 a 4 a4 a 5 a5 a 6 a6 b 7 a7 b 8 a8 b 9 a9 b 10 a10 e 7 a11 e 1 a12 e 4 a13 A列B列C列 a 1 a1 a 2 a2 a 3 a3 a4 a 5 a5 a 6 a6 b 7 a7 b 8 a8 b 9 a9 b 10 a10 e 7 a11 E1A12 e 4 a13 在显示数据时,我应在列A中计算相同的值,并显示如下所示

Col_A Col_B Col_C Col_D a 1 a1 a 2 a2 a 3 a3 a 4 a4 a 5 a5 a 6 a6 6 b 7 a7 b 8 a8 b 9 a9 b 10 a10 4 e 7 a11 e 1 a12 e 4 a13 3 列A列B列C列D a 1 a1 a 2 a2 a 3 a3 a4 a 5 a5 a 6 a6 6 b 7 a7 b 8 a8 b 9 a9 b 10 a10 4 e 7 a11 E1A12 e 4 a13 3
谢谢,这是一种方法。Lead()用于检查这是否是集合的最后一行,row_number用于计算行数:

select Col_A, Col_B, Col_C, case when isnull(NextA,'') != Col_A then RN end
from (
  select 
    *, 
    row_number() over (partition by Col_A order by Col_C) as RN,
    lead(Col_A) over (order by Col_A, Col_C) as NextA
  from Table1
) X
对于2008年,使用相反的行号也应该有效:

select Col_A, Col_B, Col_C, case when RN2 = 1 then RN end
from (
  select 
    *, 
    row_number() over (partition by Col_A order by Col_C asc) as RN,
    row_number() over (partition by Col_A order by Col_C desc) as RN2
  from Table1
) X

您可以检查行数是否等于count()over(),如果是,则显示计数

SELECT  [Col_A], 
        [Col_B], 
        [Col_C],
        (CASE WHEN ROW_NUMBER() OVER (PARTITION BY [Col_A] ORDER BY [Col_B]) = COUNT(*) OVER (PARTITION BY COL_A) 
            THEN COUNT(*) OVER (PARTITION BY COL_A) END) AS Col_D
FROM    Table1

SQL 2008有
行编号()

SELECT X.*,  (CASE WHEN rn=1 THEN total END) as count_A
FROM ( SELECT Col_A, 
              Col_B, 
              Col_C, 
              row_number() over 
                (partition by Col_A order by Col_C DESC) as rn
       from test
     ) X
join (
       SELECT [Col_A] , 
              count([Col_A]) as total
       FROM test GROUP BY [Col_A]
    ) Y
   ON X.[Col_A] = Y.[Col_A]
ORDER BY X.Col_A,          
         X.Col_C 
输出

编辑v2.0:这可能也会起作用,不需要加入

SELECT X.*, 
       (CASE WHEN rn=1 
             THEN MAX(rn) OVER (partition BY X.col_a) 
        END) as count_A 
FROM ( SELECT Col_A, 
              Col_B, 
              Col_C, 
              row_number() over (partition by Col_A order by Col_C DESC) as rn
       from test
     ) X
ORDER BY X.Col_A,          
         X.Col_C 

为什么?最好在前端执行此操作。这是为了进行自动化测试和验证数据。将当前结果粘贴到Excel并在Excel中执行会更容易。感谢JamesZ的输入,我刚刚意识到我们正在使用SQL Server 2008:-(@Gaurav你也可以用row_号来回答,谢谢你Juan和我尝试了这个查询,结果成功了。