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

MS SQL Server Discussion :

Incrémentation sur condition [2008R2]


Sujet :

MS SQL Server

  1. #1
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut Incrémentation sur condition
    Bonjour,

    Je cherche et je n'arrive pas à trouver comment faire un +1 suivant un condition.

    J'ai une vue qui me retourne différentes colonnes
    Dans une de ses colonnes j'ai les valeurs suivantes.

    Identifiant Ref Valeur
    1 a 1
    2 a 11
    3 a 11
    4 a 11
    5 a 11
    6 a 21
    7 a 1
    8 a 11
    9 a 11
    10 a 11
    11 a 11
    12 a 11
    13 a 11
    14 a 11
    15 a 11
    16 a 21
    17 a 1
    18 a 11
    19 a 11
    20 a 21
    21 B 1
    22 B 11
    23 B 11
    24 B 11
    25 B 11
    26 B 21
    27 B 1
    28 B 11
    29 B 11
    30 B 11
    31 B 11
    32 B 21
    Voici mon problème.

    Je veux ajouter un compteur dans ma vue qui me fait plus 1 à chaque fois que ma Valeur vaut 1 grouper par Ref

    Ce qui ferait un truc du genre

    Identifiant Ref Valeur Compteur
    1 a 1 1
    2 a 11 1
    3 a 11 1
    4 a 11 1
    5 a 11 1
    6 a 21 1
    7 a 1 2
    8 a 11 2
    9 a 11 2
    10 a 11 2
    11 a 11 2
    12 a 11 2
    13 a 11 2
    14 a 11 2
    15 a 11 2
    16 a 21 2
    17 a 1 3
    18 a 11 3
    19 a 11 3
    20 a 21 3
    21 B 1 1
    22 B 11 1
    23 B 11 1
    24 B 11 1
    25 B 11 1
    26 B 21 1
    27 B 1 2
    28 B 11 2
    29 B 11 2
    30 B 11 2
    31 B 11 2
    32 B 21 2
    Merci d'avance pour votre aide.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Utilisez une fonction de fenêtrage pour faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(*) OVER(PARTITION BY Ref, valeur ORDER BY Identifiant)
    A lire : http://sqlpro.developpez.com/article...clause-window/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Bonjour,

    Merci pour cette réponse.

    Voici un jeu d'essai
    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
    DECLARE @Table as Table    (Identifiant int
        , Ref nvarchar(10)
        ,Valeur int)
     
    INSERT INTO @Table VALUES(1,'a',1)
    INSERT INTO @Table VALUES(2,'a',11)
    INSERT INTO @Table VALUES(3,'a',11)
    INSERT INTO @Table VALUES(4,'a',11)
    INSERT INTO @Table VALUES(5,'a',11)
    INSERT INTO @Table VALUES(6,'a',21)
    INSERT INTO @Table VALUES(7,'a',1)
    INSERT INTO @Table VALUES(8,'a',11)
    INSERT INTO @Table VALUES(9,'a',11)
    INSERT INTO @Table VALUES(10,'a',11)
    INSERT INTO @Table VALUES(11,'a',11)
    INSERT INTO @Table VALUES(12,'a',11)
    INSERT INTO @Table VALUES(13,'a',11)
    INSERT INTO @Table VALUES(14,'a',11)
    INSERT INTO @Table VALUES(15,'a',11)
    INSERT INTO @Table VALUES(16,'a',21)
    INSERT INTO @Table VALUES(17,'a',1)
    INSERT INTO @Table VALUES(18,'a',11)
    INSERT INTO @Table VALUES(19,'a',11)
    INSERT INTO @Table VALUES(20,'a',21)
    INSERT INTO @Table VALUES(21,'B',1)
    INSERT INTO @Table VALUES(22,'B',11)
    INSERT INTO @Table VALUES(23,'B',11)
    INSERT INTO @Table VALUES(24,'B',11)
    INSERT INTO @Table VALUES(25,'B',11)
    INSERT INTO @Table VALUES(26,'B',21)
    INSERT INTO @Table VALUES(27,'B',1)
    INSERT INTO @Table VALUES(28,'B',11)
    INSERT INTO @Table VALUES(29,'B',11)
    INSERT INTO @Table VALUES(30,'B',11)
    INSERT INTO @Table VALUES(31,'B',11)
    INSERT INTO @Table VALUES(32,'B',21)
    Lorsque je fait cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
    ,COUNT(*) OVER(PARTITION BY Ref, valeur ORDER BY Identifiant)
    from @table
    j'ai le message
    Syntaxe incorrecte vers le mot clé 'ORDER'.
    Si j'enlève la partie ORBER BY
    voici mon résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * 
    ,COUNT(*) OVER(PARTITION BY Ref, valeur)
    from @table
    ORDER BY Identifiant
    Identifiant Ref Valeur (Aucun nom de colonne)
    1 a 1 3
    2 a 11 14
    3 a 11 14
    4 a 11 14
    5 a 11 14
    6 a 21 3
    7 a 1 3
    8 a 11 14
    9 a 11 14
    10 a 11 14
    11 a 11 14
    12 a 11 14
    13 a 11 14
    14 a 11 14
    15 a 11 14
    16 a 21 3
    17 a 1 3
    18 a 11 14
    19 a 11 14
    20 a 21 3
    21 B 1 2
    22 B 11 8
    23 B 11 8
    24 B 11 8
    25 B 11 8
    26 B 21 2
    27 B 1 2
    28 B 11 8
    29 B 11 8
    30 B 11 8
    31 B 11 8
    32 B 21 2
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Quelle version de SQL Server ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Autant pour moi,

    J'ai ajouter le préfixe à la discussion.

    Je suis sous 2008R2 SP2.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Le traitement que vous voulez faire est un peu particulier ! Au premier abord, il s'apparente à un traitement procédurale avec la ré-initialisation des compteurs etc. Il est toute fois possible d'exprimer directement la requête en langage ensembliste comme cela est exposé ci-après :

    Code SQL : 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
    ; WITH
    CTE_Table
        AS
        ( SELECT Identifiant, Ref, Valeur,
        ROW_NUMBER() OVER (ORDER BY Identifiant) AS RowNumber
        FROM @Table
        ),
    CTE_CPT
        AS
        ( SELECT Identifiant, Ref, Valeur,
            ROW_NUMBER() OVER (PARTITION BY Ref ORDER BY Identifiant) AS Compteur
            FROM @Table
            WHERE Valeur = 1
        )
    SELECT T.Identifiant, T.Ref, T.Valeur, C.Compteur
    FROM  CTE_Table T
    INNER jOIN CTE_CPT  C
      ON C.Ref = T.Ref
      AND C.Identifiant = ( SELECT  MAX(T2.Identifiant)
                            FROM CTE_Table as T2
                            WHERE T2.Ref = T.Ref
                            AND   T2.Valeur = 1
                            AND   T2.Identifiant <=  T.Identifiant
                            )
    ORDER BY T.Identifiant
    Résultat de la requête :

    Code SQL : 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
    Identifiant	Ref	Valeur	Compteur
    1	a	1	1
    2	a	11	1
    3	a	11	1
    4	a	11	1
    5	a	11	1
    6	a	21	1
    7	a	1	2
    8	a	11	2
    9	a	11	2
    10	a	11	2
    11	a	11	2
    12	a	11	2
    13	a	11	2
    14	a	11	2
    15	a	11	2
    16	a	21	2
    17	a	1	3
    18	a	11	3
    19	a	11	3
    20	a	21	3
    21	B	1	1
    22	B	11	1
    23	B	11	1
    24	B	11	1
    25	B	11	1
    26	B	21	1
    27	B	1	2
    28	B	11	2
    29	B	11	2
    30	B	11	2
    31	B	11	2
    32	B	21	2
    Le résultat obtenu correspond exactement au résultat attendu.

    Quelques explications
    1 - La CTE_CPT représente la CTE des compteurs. Cette "vue" génère le résultat (les 5 lignes ci-dessous ) suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Identifiant Ref Valeur  Compteur
    1   a   1   1
    7   a   1   2
    17  a   1   3
    21  B   1   1
    27  B   1   2
    2 - Une jointure entre la table principale @Table (c.à.d CTE_Table) et la CTE des compteurs (CTE_CPT) permet de déterminer pour chacune des lignes la valeur du compteur. Le lien entre la table principale @Table et la CTE des compteurs est un peu subtile avec l'expression MAX(T2.Identifiant) etc.. dans la clause de jointure, mais toutefois, cela peut se comprendre aisément.

    3 - Et le tour est joué !

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  7. #7
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Bonjour,

    Merci pour la solution, ainsi que les explications.
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par mail.spam Voir le message
    Autant pour moi,

    J'ai ajouter le préfixe à la discussion.

    Je suis sous 2008R2 SP2.
    Normal, la partie ORDER BY dans la clause OVER pour le calcul des agrégats fenetrés n'est disponible que depuis la version 2012.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Normal, la partie ORDER BY dans la clause OVER pour le calcul des agrégats fenetrés n'est disponible que depuis la version 2012.

    A +
    Oui, tout à fait.
    Je voudrais juste préciser que pour les fonctions d'agrégation (SUM, AVG, etc..) la clause ORDER BY permet d'obtenir des agrégats cumulés traduisant l'évolution de agrégat (Exemple l'évolution des ventes au cours des mois etc.).
    Sans cette spécificité ou fonctionnalité (agrégat cumulé), très intéressante, très utile, et qui était très attendue par les développeurs, nouveauté rajoutée depuis la version SQL Server 2012, la clause ORDER BY, pour calculer un agrégat comme un SUM, n'aurait aucun sens puisque l'addition est une loi de composition interne commutative et associative.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par mail.spam Voir le message
    Autant pour moi,

    J'ai ajouter le préfixe à la discussion.

    Je suis sous 2008R2 SP2.
    C'est donc normal. La partie ORDER BY pour les agrégats fenêtrés n'est pas implémenté dans cette version. Il vous faut la version 2012 ou +

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/02/2006, 11h13
  2. Requete SQL sur condition aléatoire
    Par Jey25 dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/02/2006, 20h51
  3. Requête avec variable incrémentée sur changement de clé.
    Par souellet dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/09/2005, 22h47
  4. Couleur cellule stringgrid sur condition...
    Par kobe dans le forum Composants VCL
    Réponses: 1
    Dernier message: 11/08/2005, 13h49
  5. [HREF]Invocation sur condition
    Par SEMPERE Benjamin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/02/2005, 13h35

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