2017-08-09 1 views
0

J'ai le tableau suivant dans SQL Server 2005 (sans la colonne GeoCodeNum, que je veux calculer)Numéro progressif basé sur des colonnes de serveur SQL

+-----------+---------+-------------+----------+------------+------------+ 
| City | Region | Street | Name | Surname | GeoCodeNum | 
+-----------+---------+-------------+----------+------------+------------+ 
| Sydney | NSW  | Wall street | Chris | Red  |   1 | 
| Sydney | NSW  | Wall street | Marc  | White  |   2 | 
| Sydney | NSW  | Sea street | Joseph | Orange  |   1 | 
| Melbourne | VIC  | Ocean orad | Jess  | Brown  |   1 | 
| Florence | Tuscany | Wine street | Luca  | Rossi  |   1 | 
| Florence | Tuscany | Wine street | Mario | Verdi  |   2 | 
| Florence | Tuscany | Wine street | Luigi | Carli  |   3 | 
| Florence | Tuscany | Beer street | Elena | Sarzetto |   1 | 
| Venice | Veneto | Old street | Giovanni | Casagrande |   1 | 
| Venice | Veneto | New street | Giuseppe | Giusti  |   1 | 
+-----------+---------+-------------+----------+------------+------------+ 

Je veux générer un GeoCodeNum basé sur la règle suivante : "assigne un numéro progressif aux enregistrements avec le même ensemble de ville, région et rue et". Peu importe l'ordre du nombre progressif. Dans l'exemple, Luca Rossi, Mario Verdi et Luigi Carli vivent tous deux à Wine Street, Florence, ils ont donc 3 numéros GeoCode différents. Giovanni Casagande et Giuseppe Giusti vivent tous deux à Venise mais dans des rues différentes, ils ont donc le même numéro de GeoCode.

Comment puis-je générer automatiquement le GeoCodeNum?

Je dois générer les résultats une fois par an mais j'ai presque 100000 enregistrements. Je ne sais pas comment commencer, j'ai essayé avec MS Excel, mais ce n'était pas utile.

+1

est l'intention de stocker cette nouvelle valeur dans la base de données ou simplement l'utiliser à des fins d'affichage? La question est étiquetée comme «sql» mais vous déclarez que votre tentative initiale était avec «MS Excel», ce qui est très différent. –

+0

Ce serait beaucoup plus facile en 2008+ - pas d'accès à cela? – ChrisV

+0

@Peter Abolins affiche simplement les valeurs dans les résultats de la requête. Je n'ai pas obtenu de résultats utiles avec SQL donc j'ai essayé d'exporter les résultats dans Excel et d'utiliser certaines fonctions, c'est la raison pour laquelle je n'ai pas inséré la balise Excel. – Nicolaesse

Répondre

2
select *, 
     row_number() over(partition by City, Region, Street order by Name, Surname) as GeoCodeNum 
from yourTable; 

ROW_NUMBER() a été apparu d'abord dans SQL Server 2005: Row_Number() function in SQL Server 2005

+0

@Rokuto Vraiment? pourriez-vous poster un lien de preuve, s'il vous plaît? Je l'utilisais depuis 2 ans avant de migrer vers 2008 R2 – sepupic

+0

Désolé, mon mauvais. J'ai regardé [ceci] (https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql) mais j'ai oublié que 'ROW_NUMBER' a été introduit en 2005 Une fois de plus, désolé. – Rokuto

+0

Cela fonctionne parfaitement merci beaucoup @sepupic. C'était exactement ce que je cherchais! – Nicolaesse

0

Je pense que ce résultat vous attend

;With cte(City ,Region, Street,Name ,Surname ) 
AS 
(
SELECT 'Sydney' , 'NSW'  , 'Wall street' , 'Chris' , 'Red'  UNION ALL 
SELECT 'Sydney' , 'NSW'  , 'Wall street' , 'Marc'  , 'White'  UNION ALL 
SELECT 'Sydney' , 'NSW'  , 'Sea street' , 'Joseph' , 'Orange' UNION ALL 
SELECT 'Melbourne' , 'VIC'  , 'Ocean orad' , 'Jess'  , 'Brown'  UNION ALL 
SELECT 'Florence' , 'Tuscany' , 'Wine street' , 'Luca'  , 'Rossi'  UNION ALL 
SELECT 'Florence' , 'Tuscany' , 'Wine street' , 'Mario' , 'Verdi'  UNION ALL 
SELECT 'Florence' , 'Tuscany' , 'Wine street' , 'Luigi' , 'Carli'  UNION ALL 
SELECT 'Florence' , 'Tuscany' , 'Beer street' , 'Elena' , 'Sarzetto' UNION ALL 
SELECT 'Venice' , 'Veneto' , 'Old street' , 'Giovanni' , 'Casagrande'UNION ALL 
SELECT 'Venice' , 'Veneto' , 'New street' , 'Giuseppe' , 'Giusti' 
) 
SELECT 
    City, 
    Region, 
    Street, 
    Name, 
    Surname, 
    ROW_NUMBER() OVER (PARTITION BY City, Region, Street ORDER BY Street) AS GeoCodeNum 
FROM cte 
0
SELECT city, 
     region, 
     street, 
     NAME, 
     surname, 
     Row_number() 
     OVER ( 
      partition BY city, region, street 
      ORDER BY NAME ASC) AS GeoCodeNum 
FROM customeraddress; 
+0

Pas seulement poster une réponse, vous pouvez ajouter une petite explication qui comprend mieux la solution à OP et futurs lecteurs ainsi. –