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 :

[SQL SERV 2005] Condition unique et determinante


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut [SQL SERV 2005] Condition unique et determinante
    Bonsoir,

    voici mon tableau OUTPUT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       DATE      VALUE    FIRST  
    ----------  -------  --------
    01/01/2010    0         0
    10/10/2010    1         1
    20/10/2010    1         0
    25/10/2010    1         0
    30/10/2010    0         0
    31/10/2010    1         0
    Bonsoir,

    Je souhaite avoir le code pour ma troisème colonne.
    Je m'explique.

    Pour chacune des dates (DATE), j'ai une valeur correspondante (VALUE) 0 ou 1.
    Je veux créer une troisième colonne (FIRST) qui va me fixer une valeur 1 à la PREMIERE VALEUR non nulle rencontrée dans la deuxième colonne.
    C'est-à-dire, que la PREMIERE FOIS que VALUE prend la valeur 1, je fixe un 1 sur cette ligne. Les lignes suivantes auront un 0.

    J'espère m'être bien fait comprendre.

  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

    pourquoi voulez-vous faire une telle chose ?
    Cette 3eme colonne n'a aucune raison d'exister !

    Si vous avez besoin de savoir quelle est la date pour laquelle la valeur est a 1 pour la première fois, vous pouvez tout simplement faire :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MIN(dte)
    FROM MaTable
    WHERE value = 1

    NB : j'ai renommé volontairement votre colonne DATE en dte, DATE étant un mot réservé...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Merci beaucoup. C'est déjà un début de réponse.

    Sinon, j'ai volontairement simplifié mon tableau OUTPOUT pour ne pas rentrer dans les détails. Mais j'insiste donc sur le fait que je dois pouvoir coder ma troisième colonne.

    D'autres idées ?

  4. #4
    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
    en vous relisant...
    Citation Envoyé par apnw7931 Voir le message
    voici mon tableau OUTPUT
    Cela signifie que c'est le resultat d'une requete ?????

    dans ce cas postez la, ainsi que la DDL de vos tables, on pourra mieux vous aider !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En utilisant la requête de aieeeuuuuu il suffit alors de faire une jointure :
    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
    With MaTable (dt, val) as
    (
    select {d '2010-01-01'}, 0 union all
    select {d '2010-10-10'}, 1 union all
    select {d '2010-10-20'}, 1 union all
    select {d '2010-10-25'}, 1 union all
    select {d '2010-10-30'}, 0 union all
    select {d '2010-10-31'}, 1
    )
      ,  SR (dt, [first]) as
    (
    select min(dt), 1
      from MaTable
     where val = 1
    )
    select mt.dt, mt.val, coalesce(SR.[first], 0) as [first]
      from MaTable as mt
           left outer join SR
             on SR.dt = mt.dt
     
    dt         val         first
    ---------- ----------- -----------
    01/01/2010 0           0
    10/10/2010 1           1
    20/10/2010 1           0
    25/10/2010 1           0
    30/10/2010 0           0
    31/10/2010 1           0
    On peut éviter la sous-requête avec une fonction de fenêtrage :
    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
    With MaTable (dt, val) as
    (
    select {d '2010-01-01'}, 0 union all
    select {d '2010-10-10'}, 1 union all
    select {d '2010-10-20'}, 1 union all
    select {d '2010-10-25'}, 1 union all
    select {d '2010-10-30'}, 0 union all
    select {d '2010-10-31'}, 1
    )
    select dt, val,
           case dt
             when min(case val when 1 then dt end) over()
             then 1
             else 0
           end as [First]
      from MaTable
     
    dt         val         first
    ---------- ----------- -----------
    01/01/2010 0           0
    10/10/2010 1           1
    20/10/2010 1           0
    25/10/2010 1           0
    30/10/2010 0           0
    31/10/2010 1           0

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Bonjour,

    merci pour vos différentes aides.
    Dans mon message initial, j'ai expréssement raccourcis et facilité mon problème pour une meilleure compréhension.
    En vue des différentes réponses, je pense que je ne dois pas simplifier autant mon problème, afin de mieux centrer mon problème.

    Ainsi, ma requête m'affiche la table ci-dessous (output), avec les colonnes DATE, PRODUIT, VALUE.
    Je souhaite trouver le code qui me permet de créer la dernière colonne FIRST.

    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
       DATE     PRODUIT   VALUE            FIRST  
    ----------  -------  --------         --------
    01/01/2010    A         0               0
    10/10/2010    A         1               1
    20/10/2010    A         1               0
    25/10/2010    A         1               0
    30/10/2010    A         0               0
    31/10/2010    A         1               0
    02/01/2010    B         0               0
    11/10/2010    B         0               0
    23/10/2010    B         0               0
    28/10/2010    B         1               1
    30/10/2010    B         1               0
    31/10/2010    B         1               0
    etc
    J'ai donc plusieurs produits (A,B,C,D, etc.), qui prennent la valeur 0 ou 1 à différentes dates (ces dates sont aléatoires).
    Je souhaite donc mettre dans la [colonne FIRST la valeur 1] lorsque la [valeur 1 apparait dans la colonne VALUE] la première fois seulement, et zero pour les dates précédentes et suivantes.

    Autre facon de voir la chose :
    Il fait donc une sorte de recherche verticale dans la colonne VALUE. Dès qu'il rencontre la valeur 1, il fixe celle-ci, et met toutes les autres valeurs à 0.

    Ou encore:
    Il met toutes les lignes à 0, sauf la première fois que la valeur 1 apparait dans la colonne VALUE.

    Ou une requête qui effectuerai quelquechose comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CASE [VALUE]
    WHEN 1 
    THEN
      CASE [DATE]
      WHEN Min(Date)
      THEN 1
      ELSE 0
    ELSE 0

    NB: ensuite, je vais devoir grouper mes résultats par date (tous produits confondus), et pour chacune des dates, determiner le nombre de fois (la somme) que la valeur 1 ait été fixé dans la colonne FIRST.

    J'espère que mon soucis est plus clair comme ca, et que vous trouverez une réponse à mon problème.

    Merci d'avance et bonne journée.

  7. #7
    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 n'avez toujours pas posté votre requete !
    Comment voulez vous qu'on la modifie si on ne la connait pas ?

    De plus, Waldar vous fourni deux solutions, les avez vous essayées ? qu'en est-il ?

    enfin :
    NB: ensuite, je vais devoir grouper mes résultats par date (tous produits confondus), et pour chacune des dates, determiner le nombre de fois (la somme) que la valeur 1 ait été fixé dans la colonne FIRST
    Est-ce le but final ? est-ce que ce que vous cherchez a faire est de trouver le nombre de "nouveaux produit/valeur" par jour ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Bonjour aieeeuuuuu,

    Vous n'avez toujours pas posté votre requete
    Il s'agit de requêtes effectuées au travail, et donc, confidentielles.
    Sinon, bien sur que j'aurai donné le code.

    Waldar vous fourni deux solutions
    Ses solutions imposent de coder les dates. Or, comme je l'ai énoncé, ce sont des dates aléatoires.

    trouver le nombre de "nouveaux produit/valeur" par jour
    En quelque sorte, oui.
    Pour reprendre votre exemple, je dois connaitre le nombre de produits vendus par jour, et le nombre de "nouveaux" produits par jour.

    Voila, j'espère avoir éclairci vos doutes

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par apnw7931 Voir le message
    Ses solutions imposent de coder les dates. Or, comme je l'ai énoncé, ce sont des dates aléatoires.
    Vous n'avez pas plutôt l'impression que c'est pour simuler votre jeu de données initial ?

  10. #10
    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
    Citation Envoyé par apnw7931 Voir le message
    Vous n'avez toujours pas posté votre requete
    Il s'agit de requêtes effectuées au travail, et donc, confidentielles.
    Sinon, bien sur que j'aurai donné le code.
    Rien de vous empêche de changer le nom des tables et des colonnes, ...
    mais sans en savoir un minimum, je ne vois pas comment on peut vous aider !

    Citation Envoyé par apnw7931 Voir le message
    Waldar vous fourni deux solutions
    Ses solutions imposent de coder les dates. Or, comme je l'ai énoncé, ce sont des dates aléatoires.
    Pas du tout ! Waldar utilise simplement des CTE comme jeu d'essai, mais bien sur il faut que vous remplaciez la CTE "MaTable" par vos propres données...
    Effectivement, s'il avait eu la structure de vos tables, il aurait peut être mis la solution finale directement, la il s'agit de la solution théorique, a adapter à votre environnement

    Citation Envoyé par apnw7931 Voir le message
    trouver le nombre de "nouveaux produit/valeur" par jour
    En quelque sorte, oui.
    Pour reprendre votre exemple, je dois connaitre le nombre de produits vendus par jour, et le nombre de "nouveaux" produits par jour.

    Voila, j'espère avoir éclairci vos doutes
    Donc la question initiale n'a rien a voir avec votre besoin final...
    Il nous faudrait la structure de vos tab... heu... je l'ai déjà dit ?

Discussions similaires

  1. [SQL Serve 2005 / Appli web] Problème d'apostrophe
    Par ndsaerith dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/06/2010, 17h11
  2. TRANSACTION sql serve 2005
    Par meddy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2008, 13h21
  3. [SQL Serv 2005 Express]Access-->Sql Serveur
    Par wishmasteer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/11/2007, 09h24
  4. Réponses: 3
    Dernier message: 30/06/2007, 13h08
  5. connexion projet Access à SQl serv 2005 exp
    Par a29595 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/01/2007, 19h44

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