Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/01/2011, 16h42   #1
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
Par défaut [SQL SERV 2005] Condition unique et determinante

Bonsoir,

voici mon tableau OUTPUT

Code :
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 06/01/2011, 16h52   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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é...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h59   #3
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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 ?
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 18h01   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2011, 19h47   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
En utilisant la requête de aieeeuuuuu il suffit alors de faire une jointure :
Code :
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 09h28   #6
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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 :
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 :
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.
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 11h09   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
Citation:
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h08   #8
Futur Membre du Club
 
Inscription : décembre 2010
Messages : 125
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 125
Points : 19
Points : 19
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
apnw7931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h36   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h46   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h17.


 
 
 
 
Partenaires

Hébergement Web