2011-09-28 67 views
0

我有一個表A(ID INT,比賽VARCHAR,TOT INT)SQL服務器:盤點記錄

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

現在,我想計算托特這是在表中存在匹配的總數。例如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 

由於

+0

什麼版本的Sql Server? – kevev22

+1

-1請不要在問題後添加任意擴展名。儘管應該清楚如何針對新案例擴展以「SUM」而不是「COUNT」給出的答案。 –

回答

2
WITH tableA(ID, Match) AS 
(
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 *, 
     CASE 
     WHEN ROW_NUMBER() OVER (PARTITION BY Match ORDER BY ID) = 1 
     THEN COUNT(*) OVER (PARTITION BY Match) 
     END AS Tot 
FROM tableA 
ORDER BY ID 
1
SELECT match, COUNT(match) as Tot 
FROM tableA 
GROUP BY match 
0

解決方案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; 

解決方案2:

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; 
+0

一些論據? –