2015-08-18 16 views
6

mia tavola è:Aggiornare la colonna al COUNT di righe per valori specifici in un'altra colonna. SQL Server

|ID |data | cr | 
| 1 | AAA | | 
| 2 | AAA | | 
| 3 | AAA | | 
| 4 | BBB | | 
| 5 | CCC | | 
| 6 | BBB | | 

Ho bisogno risultato:

|ID |data | cr | 
| 1 | AAA | 3 | 
| 2 | AAA | 3 | 
| 3 | AAA | 3 | 
| 4 | BBB | 2 | 
| 5 | CCC | 1 | 
| 6 | BBB | 2 | 

Abbiamo trovato questo Update a column value to the COUNT of rows for specific values in same table e l'ho provato:

UPDATE MyTbl a, 
     (SELECT data,COUNT(*) cnt 
      FROM MyTbl 
      GROUP BY data) b 
    SET a.cr = b.cnt 
    WHERE a.data= b.data 

SQL Server dà errore:

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. 
Msg 102, Level 15, State 1, Line 4 Incorrect syntax near 'b'. 

Qualsiasi idea su come eseguire questa operazione in SQL Server (2014 Express).

Grazie in anticipo.

risposta

5

Deve essere Update..set...from. Provate questo:

update a 
set a.cr=b.cnt 
from MyTbl a join 
    (SELECT data,COUNT(*) cnt 
      FROM MyTbl 
      GROUP BY data) b on a.data=b.data 

Risultato:

ID data cr 
-------------- 
1 AAA  3 
2 AAA  3 
3 AAA  3 
4 BBB  2 
5 CCC  1 
6 BBB  2 

Demo in SQL Fiddle

+0

troppo velocemente si sono :) –

+0

@StefanMichev: Dobbiamo essere superveloce;) –

+0

Works, belle. Questo è stato veloce. Grazie Bull :) – Kaptah

2

Qualcosa di simile

UPDATE t SET 
    t.cr = vv.c 
from MyTbl as t 
left outer join 
(
    select count(*) as c , data from MyTbl group by data 
) as vv on vv.data = t.data 
0
;with x as 
(
    SELECT Data , COUNT(*) AS cr 
    FROM Table 
    GROUP BY Data 
) 
UPDATE t 
SET t.cr = x.cr 
FROM x INNER JOIN Table t ON x.data = t.data 
2

È possibile utilizzare count con window function per trovare il conteggio di ciascun gruppo. utilizzare questo

;WITH cte 
    AS (SELECT Count(1)OVER(partition BY data) AS crc,* 
     FROM MyTbl) 
UPDATE cte 
SET cr = crc 

SQLFIDDLE DEMO

+1

Bello che non sia stato aggiunto nessun join aggiuntivo. [SQL Fiddle] (http://sqlfiddle.com/#!6/bc02f/6) – ughai

+0

@ughai - Grazie amico –

1

Poiché si utilizza SQL Server 2014 versione, vi consiglio funzione finestrato utilizzato all'interno di un self join sintassi di aggiornamento del tipo di query.

update a 
set a.cr= b.v 
from 
(select id, count(1) over(partition by data order by data) as v from myTbl) b 
join 
myTbl a on a.ID=b.id 
-- now see the result here 
select * from MyTbl 

violino Sql per demo http://sqlfiddle.com/#!6/bc02f/4

Problemi correlati