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

Langage SQL Discussion :

Créer une vue qui double les enregistrements d'une table


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut Créer une vue qui double les enregistrements d'une table
    Bonjour,

    Dans SQL Server Management Studio, je voudrais pouvoir créer une vue qui me permette d'obtenir tous les enregistrements d'une table en double.
    C'est à dire que tous les enregistrements se voient deux fois mais la deuxième fois, certaines colonnes sont inversées (CompteCR, compteDB) et les colonnes contenant des montants sont multipliées par -1

    J'ai commencé par créer une vue qui m'inverse les colonnes et fait la multiplication par -1 : voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT        [N°], NoDeb, NoDebFact, Nom, Libelle, NoFacture, DateFacture, DateEcheance, MontantTTC * - 1 AS MontTTC, CdeTVA, TauxTVA, MontantTVA * - 1 AS MonHT, MontantHT, DatePaiement, CompteCR, CompteDB, 
                             TypeTR, SocieteFS, CompteSteGr, CdeTVASteGr, NoCreancier, TexteCodif1, TexteCodif2
    FROM            dbo.Transactions
    Ensuite, j'ai crée une deuxième vue qui utilise la table de base et la première vue pour obtenir le résultat que j'aimerais. Voici le code de la deuxième vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT        *
    FROM            dbo.Transactions
    where            dbo.transactions.datefacture >= '2017-01-01' 
    union
    select         *
    from             dbo.vue_transactions
    where           dbo.vue_transactions.datefacture >= '2017-01-01'
    Cela fonctionne très bien, j'obtiens donc :

    NoDeb DateFacture MontantTTC MontantTVA CompteDB CompteCR
    1 2545 2017-12-05 108 8 1100 3000
    1 2545 2017-12-05 -108 -8 3000 1100

    Ma question est : n'y a t-il pas plus simple pour arriver au même résultat ?

    Merci d'avance de vos réponses et commentaires.

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

    Vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT        [N°], NoDeb, NoDebFact, Nom, Libelle, NoFacture, DateFacture, DateEcheance, MontantTTC * v AS MontTTC, CdeTVA, TauxTVA, MontantTVA * v AS MonHT, MontantHT, DatePaiement, CASE WHEN v = 1 THEN CompteCR ELSE CompteDB END AS CompteCR, CASE WHEN v = 1 THEN CompteDB ELSE CompteCR END AS CompteDB, 
                             TypeTR, SocieteFS, CompteSteGr, CdeTVASteGr, NoCreancier, TexteCodif1, TexteCodif2
    FROM            dbo.Transactions
    CROSS JOIN (  SELECT 1 AS v UNION ALL SELECT -1) AS T
    Je serais curieux de connaitre le besoin qui se cache derrière tout ça...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonjour, merci pour votre proposition, je vais essayer cela demain.

    C'est pour un programme de comptabilité. La saisie se fait en écriture simple et cette vue me permet d'avoir l'écriture double.
    Dans la colonne CompteDB j'ai toutes les écritures pour un compte.

    Je vous donne des nouvelles dès que j'ai testé. Bonne soirée

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Votre remarque « Je serais curieux de connaître le besoin qui se cache derrière tout ça… » m’a fait réfléchir quant à l’opportunité de tout doubler. Jusqu’à présent, tout étant dans Excel, je n’avais pas le choix. J’ai donc réfléchi « SQL » et trouvé la solution suivante qui me semble être beaucoup plus efficace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT        TOP (100) PERCENT [N°], NoDeb, NoDebFact, Nom, Libelle, NoFacture, DateFacture, DateEcheance, CASE WHEN CompteCR = '1100' THEN MontantTTC * - 1 ELSE MontantTTC END AS MonTTC, CdeTVA, TauxTVA, 
                             CASE WHEN CompteCR = '1100' THEN MontantTVA * - 1 ELSE MontantTVA END AS MonTVA, CASE WHEN CompteCR = '1100' THEN MontantHT * - 1 ELSE MontantHT END AS MonHT, DatePaiement, CompteDB, 
                             CompteCR, TypeTR, SocieteFS, CompteSteGr, CdeTVASteGr, NoCreancier, TexteCodif1, TexteCodif2
    FROM            dbo.Transactions
    WHERE        (CompteDB = N'1100') AND (DateFacture >= CONVERT(DATETIME, '2017-01-01 00:00:00', 102)) OR
                             (CompteCR = N'1100') AND (DateFacture >= CONVERT(DATETIME, '2017-01-01 00:00:00', 102))
    ORDER BY DateFacture
    Bien entendu, le no de compte (ici 1100) devra être une variable.
    Encore merci et bonne journée

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

Discussions similaires

  1. [Toutes versions] [Article ] Concevoir une liste qui filtre les enregistrements selon {}
    Par argyronet dans le forum Access
    Réponses: 30
    Dernier message: 29/09/2014, 12h34
  2. Réponses: 7
    Dernier message: 18/03/2013, 20h39
  3. Réponses: 5
    Dernier message: 01/02/2013, 11h40
  4. requete qui Supprime les enregistrement d'une table
    Par mqsi dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 24/10/2007, 12h04

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