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 :

Requête pour multiplier des lignes selon des bornes


Sujet :

MS SQL Server

  1. #1
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut Requête pour multiplier des lignes selon des bornes
    Bonjour,
    Le titre n'est peut-être pas explique mais ce que je souhaite est de répéter des lignes d'une table A selon les valeurs d'une table B.
    Le bout de script suivant et quelques explications permettront de comprendre je pense.

    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
    with tabA AS (
    	select 201101 as date, 'A' as val UNION ALL
    	select 201103, 'B' UNION ALL
    	select 201107, 'C'
    ),
    tabB as (
    	select 201101 as date UNION ALL
    	select 201102 as date UNION ALL
    	select 201103 as date UNION ALL
    	select 201104 as date UNION ALL
    	select 201105 as date UNION ALL
    	select 201106 as date UNION ALL
    	select 201107 as date UNION ALL
    	select 201108 as date UNION ALL
    	select 201109 as date 	
    )
    select 
    	tabA.val 
    	, tabA.date as dateval
    	, tabB.date as date
    from tabA, tabB
    La table A représente des valeurs valable à date.
    La table B représente une liste de dates pour lesquelles je souhaite obtenir les valeurs valables.

    Je souhaite donc filtrer la requête précédente pour n'obtenir quel les lignes pour lesquelles la valeur courante est toujours valable, i.e. il n'y a pas eu de nouvelle définition de valeur.

    Le résultat souhaité devrait être celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select 201101 as date, 'A' as val UNION ALL
    select 201102 as date, 'A' as val UNION ALL
    select 201103 as date, 'B' as val UNION ALL
    select 201104 as date, 'B' as val UNION ALL
    select 201105 as date, 'B' as val UNION ALL
    select 201106 as date, 'B' as val UNION ALL
    select 201107 as date, 'C' as val UNION ALL
    select 201108 as date, 'C' as val UNION ALL
    select 201109 as date, 'C' as val
    Merci pour votre aide.

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Le résultat souhaité devrait être celui-ci :
    Code :
    SELECT 201101 AS date, 'A' AS val UNION ALL
    SELECT 201102 AS date, 'A' AS val UNION ALL
    SELECT 201103 AS date, 'B' AS val UNION ALL
    SELECT 201104 AS date, 'B' AS val UNION ALL
    SELECT 201105 AS date, 'B' AS val UNION ALL
    SELECT 201106 AS date, 'B' AS val UNION ALL
    SELECT 201107 AS date, 'C' AS val UNION ALL
    SELECT 201108 AS date, 'C' AS val UNION ALL
    SELECT 201109 AS date, 'C' AS val
    Merci pour votre aide.
    Bonjour,

    Vous devez simplement faire un CROSS JOIN de vos deux tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM tabA CROSS JOIN  tabB

  3. #3
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Le problème comme cela est que toutes les valeurs sont répétées pour toutes les dates.
    Or je ne souhaite pas obtenir les lignes non valables ; Comme par exemple :

    201103 A
    201104 A

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Avec ceci par exemple :
    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
     
    WITH tabA AS (
    	SELECT 201101 AS dte, 'A' AS val UNION ALL
    	SELECT 201103, 'B' UNION ALL
    	SELECT 201107, 'C'
    ),
    tabB AS (
    	SELECT 201101 AS dte UNION ALL
    	SELECT 201102 AS dte UNION ALL
    	SELECT 201103 AS dte UNION ALL
    	SELECT 201104 AS dte UNION ALL
    	SELECT 201105 AS dte UNION ALL
    	SELECT 201106 AS dte UNION ALL
    	SELECT 201107 AS dte UNION ALL
    	SELECT 201108 AS dte UNION ALL
    	SELECT 201109 AS dte 	
    ),
    bornes AS (
    	SELECT deb.dte AS debut, 
    		(
    			SELECT MIN(dte) 
    			FROM tabA fin 
    			WHERE fin.dte > deb.dte
    		) AS fin ,
    		deb.val 
    	FROM tabA deb
    )
    SELECT bornes.val, tabB.dte
    FROM tabB
    LEFT OUTER JOIN bornes 
    	ON tabB.dte >= bornes.debut
    	AND (tabB.dte < bornes.fin OR bornes.fin IS NULL)

  5. #5
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Ahh mais c'est parfait !!!
    Merci beaucoup

    Super pour la réactivité.

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

Discussions similaires

  1. [Toutes versions] Macro pour sélectionner des lignes selon un critère
    Par logoyvelines dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/09/2011, 10h20
  2. Réponses: 2
    Dernier message: 15/02/2010, 01h07
  3. Réponses: 8
    Dernier message: 29/04/2008, 13h58
  4. Réponses: 2
    Dernier message: 04/07/2007, 20h33
  5. Traitement des lignes [suppression des lignes vides]
    Par turbo_chess dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2007, 09h16

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