sql server:计数记录

sql server:计数记录,sql,sql-server,Sql,Sql Server,我有一个表(ID int,Match varchar,tot int) 现在,我想计算Tot,它是表中存在的匹配总数。例如123发生两次,12存在三次,依此类推。还请注意,我只希望在第一次匹配时计数。以下是预期结果: ID Match Tot 1 123 2 2 123 3 12 3 4 12 5 4 1 6 12 7 8 1 另一种情况: ID Match Count Tot 1 123 2 2 123 1

我有一个表(ID int,Match varchar,tot int)

现在,我想计算Tot,它是表中存在的匹配总数。例如123发生两次,12存在三次,依此类推。还请注意,我只希望在第一次匹配时计数。以下是预期结果:

ID Match Tot
1  123    2
2  123
3  12     3
4  12
5  4      1
6  12
7  8      1
另一种情况:

    ID Match Count Tot
    1  123   2
    2  123   1
    3  12    10
    4  12    10
    5  4     3
    6  12    5
    7  8     7
现在我想为同一个匹配添加计数。预期结果:

    ID Match Count Tot
    1  123   2      3
    2  123   1
    3  12    10     25
    4  12    10
    5  4     3       3
    6  12    5  
    7  8     7       7

谢谢

解决方案1:

DECLARE @MyTable TABLE
(
    ID INT PRIMARY KEY
    ,Match VARCHAR(10) NOT NULL
    ,Tot INT NULL
);
INSERT  @MyTable(ID, Match)
SELECT 1,  123
UNION ALL
SELECT 2,  123
UNION ALL
SELECT 3,  12
UNION ALL
SELECT 4,  12
UNION ALL
SELECT 5,  4
UNION ALL
SELECT 6,  12
UNION ALL
SELECT 7,  8;

--SELECT
SELECT  *
        ,CASE 
            WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
            THEN COUNT(*)OVER(PARTITION BY a.Match)
        END TotCalculated
FROM    @MyTable a;

--UPDATE
WITH MyCTE
AS
(
    SELECT  a.Tot
            ,CASE 
                WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
                THEN COUNT(*)OVER(PARTITION BY a.Match)
            END TotCalculated
    FROM    @MyTable a
)
UPDATE  MyCTE 
SET     Tot = TotCalculated;

SELECT  *
FROM    @MyTable;
UPDATE  @MyTable
SET     Tot = NULL;

SELECT  x.ID, y.Num
FROM
(
    SELECT  b.Match, MIN(b.ID) ID
    FROM    @MyTable b
    GROUP BY b.Match
) x INNER JOIN
(
    SELECT  a.Match, COUNT(*) AS Num
    FROM    @MyTable a
    GROUP BY a.Match
) y ON x.Match = y.Match
ORDER BY x.ID

UPDATE  @MyTable
SET     Tot = t.Num
FROM    @MyTable z 
INNER JOIN
(
        SELECT  x.ID, y.Num
        FROM
        (
            SELECT  b.Match, MIN(b.ID) ID
            FROM    @MyTable b
            GROUP BY b.Match
        ) x INNER JOIN
        (
            SELECT  a.Match, COUNT(*) AS Num
            FROM    @MyTable a
            GROUP BY a.Match
        ) y ON x.Match = y.Match
) t     ON z.ID = t.ID;

SELECT  *
FROM    @MyTable;
解决方案2:

DECLARE @MyTable TABLE
(
    ID INT PRIMARY KEY
    ,Match VARCHAR(10) NOT NULL
    ,Tot INT NULL
);
INSERT  @MyTable(ID, Match)
SELECT 1,  123
UNION ALL
SELECT 2,  123
UNION ALL
SELECT 3,  12
UNION ALL
SELECT 4,  12
UNION ALL
SELECT 5,  4
UNION ALL
SELECT 6,  12
UNION ALL
SELECT 7,  8;

--SELECT
SELECT  *
        ,CASE 
            WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
            THEN COUNT(*)OVER(PARTITION BY a.Match)
        END TotCalculated
FROM    @MyTable a;

--UPDATE
WITH MyCTE
AS
(
    SELECT  a.Tot
            ,CASE 
                WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
                THEN COUNT(*)OVER(PARTITION BY a.Match)
            END TotCalculated
    FROM    @MyTable a
)
UPDATE  MyCTE 
SET     Tot = TotCalculated;

SELECT  *
FROM    @MyTable;
UPDATE  @MyTable
SET     Tot = NULL;

SELECT  x.ID, y.Num
FROM
(
    SELECT  b.Match, MIN(b.ID) ID
    FROM    @MyTable b
    GROUP BY b.Match
) x INNER JOIN
(
    SELECT  a.Match, COUNT(*) AS Num
    FROM    @MyTable a
    GROUP BY a.Match
) y ON x.Match = y.Match
ORDER BY x.ID

UPDATE  @MyTable
SET     Tot = t.Num
FROM    @MyTable z 
INNER JOIN
(
        SELECT  x.ID, y.Num
        FROM
        (
            SELECT  b.Match, MIN(b.ID) ID
            FROM    @MyTable b
            GROUP BY b.Match
        ) x INNER JOIN
        (
            SELECT  a.Match, COUNT(*) AS Num
            FROM    @MyTable a
            GROUP BY a.Match
        ) y ON x.Match = y.Match
) t     ON z.ID = t.ID;

SELECT  *
FROM    @MyTable;

解决方案1:

DECLARE @MyTable TABLE
(
    ID INT PRIMARY KEY
    ,Match VARCHAR(10) NOT NULL
    ,Tot INT NULL
);
INSERT  @MyTable(ID, Match)
SELECT 1,  123
UNION ALL
SELECT 2,  123
UNION ALL
SELECT 3,  12
UNION ALL
SELECT 4,  12
UNION ALL
SELECT 5,  4
UNION ALL
SELECT 6,  12
UNION ALL
SELECT 7,  8;

--SELECT
SELECT  *
        ,CASE 
            WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
            THEN COUNT(*)OVER(PARTITION BY a.Match)
        END TotCalculated
FROM    @MyTable a;

--UPDATE
WITH MyCTE
AS
(
    SELECT  a.Tot
            ,CASE 
                WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
                THEN COUNT(*)OVER(PARTITION BY a.Match)
            END TotCalculated
    FROM    @MyTable a
)
UPDATE  MyCTE 
SET     Tot = TotCalculated;

SELECT  *
FROM    @MyTable;
UPDATE  @MyTable
SET     Tot = NULL;

SELECT  x.ID, y.Num
FROM
(
    SELECT  b.Match, MIN(b.ID) ID
    FROM    @MyTable b
    GROUP BY b.Match
) x INNER JOIN
(
    SELECT  a.Match, COUNT(*) AS Num
    FROM    @MyTable a
    GROUP BY a.Match
) y ON x.Match = y.Match
ORDER BY x.ID

UPDATE  @MyTable
SET     Tot = t.Num
FROM    @MyTable z 
INNER JOIN
(
        SELECT  x.ID, y.Num
        FROM
        (
            SELECT  b.Match, MIN(b.ID) ID
            FROM    @MyTable b
            GROUP BY b.Match
        ) x INNER JOIN
        (
            SELECT  a.Match, COUNT(*) AS Num
            FROM    @MyTable a
            GROUP BY a.Match
        ) y ON x.Match = y.Match
) t     ON z.ID = t.ID;

SELECT  *
FROM    @MyTable;
解决方案2:

DECLARE @MyTable TABLE
(
    ID INT PRIMARY KEY
    ,Match VARCHAR(10) NOT NULL
    ,Tot INT NULL
);
INSERT  @MyTable(ID, Match)
SELECT 1,  123
UNION ALL
SELECT 2,  123
UNION ALL
SELECT 3,  12
UNION ALL
SELECT 4,  12
UNION ALL
SELECT 5,  4
UNION ALL
SELECT 6,  12
UNION ALL
SELECT 7,  8;

--SELECT
SELECT  *
        ,CASE 
            WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
            THEN COUNT(*)OVER(PARTITION BY a.Match)
        END TotCalculated
FROM    @MyTable a;

--UPDATE
WITH MyCTE
AS
(
    SELECT  a.Tot
            ,CASE 
                WHEN ROW_NUMBER()OVER(PARTITION BY a.Match ORDER BY a.ID ASC)=1
                THEN COUNT(*)OVER(PARTITION BY a.Match)
            END TotCalculated
    FROM    @MyTable a
)
UPDATE  MyCTE 
SET     Tot = TotCalculated;

SELECT  *
FROM    @MyTable;
UPDATE  @MyTable
SET     Tot = NULL;

SELECT  x.ID, y.Num
FROM
(
    SELECT  b.Match, MIN(b.ID) ID
    FROM    @MyTable b
    GROUP BY b.Match
) x INNER JOIN
(
    SELECT  a.Match, COUNT(*) AS Num
    FROM    @MyTable a
    GROUP BY a.Match
) y ON x.Match = y.Match
ORDER BY x.ID

UPDATE  @MyTable
SET     Tot = t.Num
FROM    @MyTable z 
INNER JOIN
(
        SELECT  x.ID, y.Num
        FROM
        (
            SELECT  b.Match, MIN(b.ID) ID
            FROM    @MyTable b
            GROUP BY b.Match
        ) x INNER JOIN
        (
            SELECT  a.Match, COUNT(*) AS Num
            FROM    @MyTable a
            GROUP BY a.Match
        ) y ON x.Match = y.Match
) t     ON z.ID = t.ID;

SELECT  *
FROM    @MyTable;

-1.提问后,不要随意添加问题的扩展名。尽管对于新的情况,应该清楚如何扩展用
SUM
给出的答案,而不是
COUNT
给出的答案。-1提问后不要随意扩展问题。尽管对于新案例,应该清楚如何扩展
SUM
而不是
COUNT
给出的答案。