Sql server 2008 按值为每组指定一个序列号

Sql server 2008 按值为每组指定一个序列号,sql-server-2008,group-by,Sql Server 2008,Group By,我有一个临时表,有许多行TümDATA。我使用GROUPBY子句将其行插入另一个临时表GrupTOT。但是我被困在这里了,我需要在分组后给行一个序列号 以下是我的SQL: INSERT INTO #GrupTOT(AY, BLK, DRE, TOT) SELECT J.AY, J.BLK, J.DRE, SUM(J.BORÇ) FROM #TümDATA J GROUP BY J.AY, J.BLK, J.DRE 您可以使用ROW_NUMBER根据订单获得编号。或者,如果需要的话,也可以

我有一个临时表,有许多行TümDATA。我使用GROUPBY子句将其行插入另一个临时表GrupTOT。但是我被困在这里了,我需要在分组后给行一个序列号

以下是我的SQL:

INSERT INTO #GrupTOT(AY, BLK, DRE, TOT) 
SELECT J.AY, J.BLK, J.DRE, SUM(J.BORÇ) 
FROM #TümDATA J 
GROUP BY J.AY, J.BLK, J.DRE
您可以使用ROW_NUMBER根据订单获得编号。或者,如果需要的话,也可以在insert中添加一列以自动递增数字

行数方法:

WITH CTE AS
(
    SELECT Col1, Col2, Col3, Count(*) as [COUNT]
    FROM dbo.Table1
    GROUP BY Col1, Col2, Col3
)
INSERT INTO dbo.Table2
    SELECT RowNum = ROW_NUMBER() OVER ( ORDER BY Col1, Col2, Col3, [COUNT] DESC ),
           Col1, Col2, Col3, [COUNT]
    FROM CTE

试试这个:在Oracle中工作

WITH ORDERS
    AS (SELECT
             TO_DATE ( '2013-09-18 00:00:01',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'John' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-19 00:00:01',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'James' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-20 00:00:01',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'John' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-20 00:00:02',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'John' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-20 00:00:03',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'John' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-20 00:00:04',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'John' AS NAME
        FROM
             DUAL
        UNION ALL
        SELECT
             TO_DATE ( '2013-09-21 16:00:01',
                     'YYYY-MM-DD HH24:MI:SS' )
                 AS THE_DATE,
             'Jennifer' AS NAME
        FROM
             DUAL)
SELECT
      THE_DATE,
      NAME,
      ROWNUM
FROM
      (SELECT
            TRUNC ( THE_DATE ) THE_DATE,
            NAME,
            COUNT ( 1 )
       FROM
            ORDERS
       GROUP BY
            TRUNC ( THE_DATE ),
            NAME);
原始数据:

9/18/2013 12:00:01 AM   John
9/19/2013 12:00:01 AM   James
9/20/2013 12:00:01 AM   John
9/20/2013 12:00:02 AM   John
9/20/2013 12:00:03 AM   John
9/20/2013 12:00:04 AM   John
9/21/2013 4:00:01 PM    Jennifer
结果:

9/21/2013   Jennifer    1
9/19/2013   James           2
9/20/2013   John            3
9/18/2013   John            4
您可以使用该函数

例如

您可以尝试使用标识列进行选择。这将创建新的临时表GrupTOT

这是一本书


向我们展示您当前使用的sql,请在此处使用;插入GrupTOTAY,BLK,DRE,TOT选择J.AY,J.BLK,J.DRE,SUMJ.BORÇ由J.AY,J.BLK,J.DRE从TümDATA J组中选择J.AY,J.BLK,J.DRE将示例SQL移动到问题中,并根据提供的SQLTanner,thnx更新我的答案,以移动HI Kaf,thnx您的答案。这适用于我的sp。您能回答其他问题吗?如果序列值起始值来自另一个表,您的解决方案是什么?您是指序列号起始值作为变量吗?是的,值来自另一个表列表C。声明一个变量并首先将该值分配给它,然后将其与行数函数一起使用。嗨,Tim,感谢您的快速回答。是否有从另一个表C中启动数值的解决方案/方法?什么是从另一个表中启动数值?您可以选择该值并将其添加到行号(如果需要)。Thnx表示答复,但Kaf的答案对我来说是最佳解决方案。Thnx表示答复,但Kaf的答案对我来说是最佳解决方案。
WITH q AS (
    SELECT field_a
    FROM SomeTable
    GROUP BY field_a
)
SELECT ROW_NUMBER() OVER(ORDER BY field_a) AS row_num,
       field_a
FROM q
SELECT SeqNo = identity(int,1,1), --Identity column
       AY = J.AY
       BLK = J.BLK, 
       DRE = J.DRE,
       TOT = SUM(J.BORÇ) 
INTO #GrupTOT
FROM #TümDATA J 
GROUP BY J.AY, J.BLK, J.DRE;

--SELECT * FROM #GrupTOT