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 table à partir de données d'une autre table


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 54
    Points : 24
    Points
    24
    Par défaut Créer une table à partir de données d'une autre table
    Bonjour,

    Est-il possible de regrouper en 1 seule table les 2 requêtes suivantes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE table r_modif AS 
    SELECT 
    	sum(MID(`enr_modif`,1,7)='2024-01' AND MID(`enr_creat`,1,7)!='2024-01') AS r_modif FROM `religieux`;
    CREATE table r_cree AS 
    SELECT 
    	sum(MID(`enr_creat`,1,7)='2024-01') AS r_cree FROM `religieux`;
    Je voudrais qch du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE table r_total AS 
    SELECT 
    	sum(MID(`enr_modif`,1,7)='2024-01' AND MID(`enr_creat`,1,7)!='2024-01') AS r_modif FROM `religieux`,
    SELECT 
    	sum(MID(`enr_creat`,1,7)='2024-01') AS r_cree FROM `religieux`;
    qui me renvoie l'erreur suivante :
    #1064 - Erreur de syntaxe près de 'SELECT
    sum(MID(`enr_creat`,1,7)='2024-01') AS r_cree FROM `religieux`' à la ligne 4
    Merci de vos lumières.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 54
    Points : 24
    Points
    24
    Par défaut créer table à partir de données d'une autre table
    Désolé pour le bruit,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE table r_total AS 
    SELECT 
    	sum(MID(`enr_modif`,1,7)='2024-01' AND MID(`enr_creat`,1,7)!='2024-01') AS r_modif,
    	sum(MID(`enr_creat`,1,7)='2024-01') AS r_cree 
    FROM `religieux`;

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Cette requête est très alambiquée
    - MID() n'est pas supporté par tous les SGBD, contrairement à SUBSTRING()
    - extraire une chaîne de caractères depuis une colonne de type DATE n'est pas supporté par de nombreux SGBD
    - effectuer directement une somme depuis le résultat d'une fonction chaîne de caractères n'est pas non plus supporté par de nombreux SGBD

    En SQL normatif on écrira donc :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sum(case when substring(cast(enr_modif as char(10)), 1, 7) = '2024-01' then 1
               end) as X 
    FROM [...]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 54
    Points : 24
    Points
    24
    Par défaut Créer une table à partir de données d'une autre table
    Merci pour cette solution canonique.

    Je peux donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE table r_total AS 
    		SELECT 
    			YEAR(NOW()) AS a,
    			MONTH(NOW()) - 1 as mm,
    		//	sum(MID(`enr_modif`,1,7)='2024-01' AND MID(`enr_creat`,1,7)!='2024-01') AS r_modif,
    			sum(case when 
    				substring(cast(enr_modif as char(10)), 1, 7) = '2024-01' AND 
    				substring(cast(enr_creat as char(10)), 1, 7) != '2024-01'
    				then 1
               end) as r_modif,
    		//	sum(MID(`enr_creat`,1,7)='2024-01') AS r_cree 
    			sum(case when substring(cast(enr_modif as char(10)), 1, 7) = '2024-01' then 1
               end) as r_cree 
    		FROM `religieux`
    Je peux donc créer une table directement dans phpMyAdmin
    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
     
    CREATE table r_total AS 
    		SELECT 
    			id,
    			YEAR(NOW()) AS a,
    			MONTH(NOW()) - 1 as mm,
    			sum(case when 
    				substring(cast(enr_modif as char(10)), 1, 7) = '2024-01' AND 
    				substring(cast(enr_creat as char(10)), 1, 7) != '2024-01'
    				then 1
               end) as r_modif,
    			sum(case when 
    				substring(cast(enr_creat as char(10)), 1, 7) = '2024-01' 
    				then 1
               end) as r_cree 
    		FROM `religieux`;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE `r_total` ADD PRIMARY KEY(`id`);
    Merci

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Nommer des colonnes "a" ou "mm" ne facilitera pas les recherches dans le code lors d'études d'impact, il serait préférable de choisir des noms un peu plus longs sans tomber dans le verbeux, par exemple "creat_aa" et "creat_mm" s'il s'agit de l'année et du mois de création, "maj_aa" et "maj_mm" pour la mise à jour...
    Il n'est pas nécessaire de s'encombrer des quotes inversées (alt GR + 7) tant que les noms d'objets ne sont pas des mots réservés SQL.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Une autre remarque, cet extrait SQL produira un résultat faux au mois de janvier :

    SELECT [...] YEAR(NOW()) AS a, MONTH(NOW()) - 1 as mm,
    Par exemple, le 10 janvier 2024, on obtiendra A=23 et mm=0, je ne pense pas que ce soit ce qui est attendu
    Il est donc préférable de passer par une fonction date comme DATE_ADD() pour retirer un mois, puis d'extraire l'année et le mois à partir de ce résultat.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2018
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2018
    Messages : 54
    Points : 24
    Points
    24
    Par défaut Créer une table à partir de données d'une autre table
    Bsr,

    Merci de vous pencher sur mes petits pb de date.

    Tout d'abord, concernant les titres de colonnes "a" et "mm", effectivement dans un développement étendu ça vaudrait la peine de mieux les identifier.
    Ici, il s'agit d'un script autonome pour calculer le bilan mensuel des nvl entrées ou modif. L'extraction est faite dans la suite du script.

    Voyons maintenant le pb des changement d'année en cherchant le mois précédent.

    J'ai contourné l'astuce en créant une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lastMonth = date('Y-m', strtotime('last day previous month'));
    Et le code devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE table r_total2 AS 
    		SELECT 
    			sum(case when 
    				substring(cast(enr_modif as char(10)), 1, 7) = '".$lastMonth."' AND 
    				substring(cast(enr_creat as char(10)), 1, 7) != '".$lastMonth."'
    				then 1
               end) as r_modif,
    			sum(case when 
    				substring(cast(enr_creat as char(10)), 1, 7) = '".$lastMonth."' 
    				then 1
               end) as r_cree 
    		FROM `religieux`
    Merci

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. remplir un champ d'une table à partir d'une autre table
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/02/2005, 16h48
  3. Réponses: 5
    Dernier message: 06/01/2005, 12h07
  4. Réponses: 3
    Dernier message: 09/07/2004, 10h23
  5. UPDATE : table à partir d'une autre
    Par Laura dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/10/2003, 21h34

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