IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[Debutant] - peupler une colonne avec 1,2,3,4,5


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut [Debutant] - peupler une colonne avec 1,2,3,4,5
    Salut,

    J ai un probleme qui est surement tout bete ...

    J ai une table contenant une seule colonne des entiers (uniques). J ai rajouté a la table une colonne d entiers (Slot) que je voudrais remplir avec 1,2,3,4,5,6,7, etc ...

    C surement tout con, mais je vois pas comment faire ca ...

    Bien evidement si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @index int
    DECLARE @TOTAL int
    SET @TOTAL=217
    SET @index=1
    WHILE @index <= @TOTAL
    	BEGIN
    	UPDATE temp_RainfallZone
    	SET Slot=@index
    	SET @index=@index+1
    	END
    je me retrouve avec pour toutes mes lignes de mon tableau la valeur @TOTAL (qui est le nombre total de ligne dans ma table).

    Désolé d etre aussi pourri ...

    Merci

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ta méthode me semble bonne mais qu'est censé représenter cette colonne d'entiers ?
    Dans quel but fais-tu cela ?

  3. #3
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Salut CinePhil et merci d essayer d aider,

    Bah en fait, je me doute que ce que je fais n est pas tres catholique mais si j ai cette colonne (comme compteur), je peux utiliser la query suivante pour utiliser une stored procedure (GetProfile) pour chacune des lignes de ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    DECLARE @index int
    DECLARE @TOTAL int
    SET @TOTAL=217
    SET @index=1
    WHILE @index <= @TOTAL
    	BEGIN
    	DECLARE @value float
    	SET @value=(SELECT RainfallZoneID FROM temp_RainfallZone WHERE Slot=@Index)
    	CREATE TABLE #Data (A float , B int, C float, D float, E float, F float , G float, H float)
    	INSERT #Data exec GetProfile @value,30,24,5,711,5
    	INSERT INTO [IrelandPluvial].[dbo].[tblTestRainfallZones]
    	([RainfallZoneID]
    	,[Time]
    	,[RainfallIntensity])
    	SELECT @value,B,H
    	FROM #Data
    	DROP TABLE #Data
    	SET @index=@index+1
    	END
    Le code que j ai ecris pour remplir 1,2,3 ... dans mon post original ne marche pas car le resultat est la valeur 217 pour chacune des lignes de ma colonne Slot, alors que j aimerais avoir 1 a la premiere ligne, puis 2, puis 3 ...

    Merci

    Slumpy
    PS : Allez toulouse !

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Bis repetita :
    Dans quel but fais-tu cela ?
    Tu parles de compteur.
    Cela veut-il dire que tu insères des paquets de 127 lignes que tu veux numéroter à chaque fois de 1 à 127 ?

    Quel est ton SGBD ?

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Slumpy, je te laisse exécuter pas à pas ce script afin de voir si cette solution te convient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    drop table NOMBRES
    go
     
    create table NOMBRES
    (
      [unique] int not null
    )
    go
     
    -- Initialisation de la table NOMBRES avec des nombres aléatoires...
    declare @nb int;
    set @nb = 1;
    while @nb <= 200
    begin
      insert into NOMBRES ([unique]) values (cast(RAND() * 1000 as int));
      set @nb = @nb + 1;
    end;
     
    -- Vérification que la table est bien remplie
    select [unique] from NOMBRES
    order by [unique];
     
    -- On crée une nouvelle colonne, NOT NULL pré-remplie avec identity(1,1)
    alter table NOMBRES add slot int identity(1,1) not null
    go
     
    -- Vérification...
    select [unique], slot
    from NOMBRES
    order by slot
     
    -- Et on vérifie même l'unicité
    create unique index UIX_NOMBRES on NOMBRES(slot)
    go
     
    -- Ca marche ^^

  6. #6
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Arf, je pensais avoir repondu au but ... sorry.

    Concretement, j ai un tableau qui a 217 lignes. Le debut du tableau est :

    Rainfall Slot
    10147 1
    10270 2
    10271 3
    10272 4
    10273 5
    10389 6
    10390 7
    10391 8
    10392 9
    10393 10
    10394 11
    10395 12

    En clair, je me suis fait chier a rentrer a la main les 217 valeurs qui se suivent dans la colonne Slot, alors que je pense qu il y a certainement un moyen de faire ca automatiquement ...

    Ca repond a ta question ?

    (J utilise SQL Sever 2005.)

    Merci pour ton aide

    Slumpy

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Sinon, à condition que ta colonne "[unique]" soit bien peuplée de valeurs unique (crée un index unique dessus pour t'en assurer), tu peux utiliser cette astuce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    update NOMBRES
    set slot = r.rownum
    from (
    select [unique], ROW_NUMBER() over (partition by 0 order by [unique]) rownum
    from NOMBRES n
    ) r
    where NOMBRES.[unique] = r.[unique];
    Attention cependant : les valeurs de la colonne SLOT seront triées dans le même order que les valeurs de la colonne UNIQUE.

  8. #8
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Sinon, à condition que ta colonne "[unique]" soit bien peuplée de valeurs unique (crée un index unique dessus pour t'en assurer), tu peux utiliser cette astuce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    update NOMBRES
    set slot = r.rownum
    from (
    select [unique], ROW_NUMBER() over (partition by 0 order by [unique]) rownum
    from NOMBRES n
    ) r
    where NOMBRES.[unique] = r.[unique];
    Attention cependant : les valeurs de la colonne SLOT seront triées dans le même order que les valeurs de la colonne UNIQUE.
    Salut StringBuilder,

    C est exactement ce que je cherchais merci. Ca marche.

    Me reste plus qu a comprendre comment elle marche lol.

    Merci bcp.

    Slumpy.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2014, 17h57
  2. [debutant] deployer une servlet avec Tomcat
    Par Braz dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 22/01/2006, 02h02
  3. [DEBUTANT]comparaison une ligne avec un STRing
    Par Battosaiii dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2005, 21h15
  4. Renommer une colonne avec ALTER TABLE...
    Par David.V dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2004, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo