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

Développement SQL Server Discussion :

Aide curseur sql server 2012 [2012]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 23
    Par défaut Aide curseur sql server 2012
    Bonjour à tous,

    je rencontre un problème avec les curseurs, je n'arrive jamais à en construire un (je tiens à préciser que je débutes sur sql server (2 semaines)).

    Voici ma table PRODUCT_RECO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRODUCT_REF TYPE PRODUCT_REF_RECO NOTE
    J'aimerais créé un curseur qui me permettrait de sélectionner les lignes de PRODUCT_REF_RECO qui sont similaires.
    Je m'explique...
    Pour un même PRODUCT_REF, je suis pas censé avoir des doublons dans PRODUCT_REF_RECO mais j'en ai (cause interne à l'entreprise).
    Voici une illustration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PRODUCT_REF TYPE PRODUCT_REF_RECO NOTE
              A                          B
              A                          V
              A                          C
              A                          C
    Je veux obtenir une table qui prend que les cas où j'aurais A C par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PRODUCT_REF TYPE PRODUCT_REF_RECO NOTE
              A                          C
              A                          C
              A                          C
              A                          C
              A                          C
              A                          C
    Je ne sais pas si je suis clair mais en tout cas si quelqu'un peut éclairer ma lanterne... je suis un peu perdu.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Vous cherchez les doublons ?
    Déjà, oubliez les curseurs, c'est contre performant, et totalement inutile pour votre besoin.

    Vous pourrez trouver sur ce forum plusieurs méthodes pour obtenir les doublons dans votre table.

    Si vous voulez obtenir les informations des colonnes n'entrant pas dans le critère de doublons (NOTE dans votre cas), vous pouvez par exemple faire comme ceci (pas testé):

    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
     
    WITH CTE AS (
        SELECT 
            PRODUCT_REF 
            , TYPE PRODUCT_REF_RECO 
            , NOTE
            , COUNT(*) OVER(PARTITION BY PRODUCT_REF , TYPE PRODUCT_REF_RECO ) AS Nb
        FROM PRODUCT_RECO 
    )
    SELECT 
            PRODUCT_REF 
            , TYPE PRODUCT_REF_RECO 
            , NOTE
    FROM CTE
    WHERE Nb > 1

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 23
    Par défaut
    J'ai trouvé la solution :

    Etape 1 : observer le nb de doublons dans chaque cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select PRODUCT_REF,PRODUCT_RECO.[TYPE], PRODUCT_REF_RECO, sum(NOTE) as note, COUNT(*) as nb
    from PRODUCT_RECO
    where NOTE > 0
    group by PRODUCT_REF,PRODUCT_RECO.[TYPE],PRODUCT_REF_RECO
    having COUNT(*)>1 
    order by PRODUCT_REF_RECO
    Etape 2 : faire un curseur pour écraser les valeurs doubles et les insérer dans une même ligne NOTE
    Du coup avant on aurait pu avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PRODUCT_REF PRODUCT_REF_RECO NOTE
              A                   B                           5
              A                   B                           13
    Et maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PRODUCT_REF PRODUCT_REF_RECO NOTE
              A                   B                           18
    Voici le curseur :
    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
     
    declare my_cursor cursor local for
     
    		select  PRODUCT_REF,PRODUCT_RECO.[TYPE], PRODUCT_REF_RECO, sum(NOTE) as note
    		from PRODUCT_RECO
    		--where   PRODUCT_REF='BODPSS60X' and PRODUCT_REF_RECO='ADIADBE10235'
    		group by PRODUCT_REF,PRODUCT_RECO.[TYPE],PRODUCT_REF_RECO 
    		having COUNT(*)>1 
    		order by PRODUCT_REF_RECO
     
    open my_cursor
    fetch next from my_cursor into @PRODUCT_REF,@TYPE,@PRODUCT_REF_RECO,@NOTE
    while @@fetch_status=0
    	begin
    		print @PRODUCT_REF + ' ' + @PRODUCT_REF_RECO
    		delete from PRODUCT_RECO where product_ref=@PRODUCT_REF and type=@TYPE and PRODUCT_REF_RECO=@PRODUCT_REF_RECO
    		insert PRODUCT_RECO  (PRODUCT_REF,PRODUCT_REF_RECO,TYPE,NOTE) values (@PRODUCT_REF,@PRODUCT_REF_RECO,@TYPE,@NOTE)
    	    fetch next from my_cursor into @PRODUCT_REF,@TYPE,@PRODUCT_REF_RECO,@NOTE
    	end
    close my_cursor
    deallocate my_cursor

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

Discussions similaires

  1. Aide sql server 2012
    Par kent69003 dans le forum Développement
    Réponses: 2
    Dernier message: 07/05/2015, 14h56
  2. Réponses: 9
    Dernier message: 31/05/2012, 08h56
  3. Optimisation d'un curseur [Sql Server 2000]
    Par nox75 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/09/2007, 16h27
  4. Problème Curseur SQL SERVER
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h19
  5. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09

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