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 :

Requête avec compteur (Imbriqué ?)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut Requête avec compteur (Imbriqué ?)
    Bonjour à tous,

    Apres pas mal de recherches et de test, et à cause de mes notions faibles de SQL, je vais appel a vous).

    Je travaille sur une base EBP, dons mes requêtes passe par un moteur ODBC Pervasive en version 8.5 (Btrieve)

    Au départ, j'ai une table qui héberge les donnes clients (avec en clé utilisable un code client) et une table qui stock les données factures (clé commune mais pas unique le code client). Si le numéro de facture est 0 cela signifie que la facture n'a pas été validée donc un devis (ou autre).

    Mon souhait est récupérer des données de la table client et ajouter une colonne nombre de factures (uniquement factures)

    J'arrive donc à Comptabiliser les factures par la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  "CLIENT"."Code",	COUNT(*)	FROM	"FACTURE",	"CLIENT"	WHERE "FACTURE"."Client" = "CLIENT"."CODE" AND "FACTURE"."Facture" <> 0 GROUP BY "CLIENT"."Code"
    Je souhaite donc reprendre ces résultats pour ajouter le résultat dans la requête qui reprends les données dont j'ai besoin et qui attaque une autre table

    Ma requête :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    SELECT 
     
    				"CLIENT"."Code"	AS	"Info EBP",
    				"CLIENT"."CODE"	AS	"Code Tiers",
    				UPPER(SUBSTRING("CLIENT"."RaisonSociale" , 1 , 20))	AS "Nom Reduit",
    				IF("CLIENT"."LastFacture_Date" = NULL() , "CLIENT"."OuvertLe" , "CLIENT"."LastFacture_Date" ) "Date Creation",
    				"CLIENT"."Compte"	AS	"Compte Auxiliaire",
    				"CLIENT"."NumTVA"	AS	"Numero TVA",
    				"CLIENT"."Siret"	AS	"Siret",
    				SUBSTRING("CLIENT"."Siret",1,9)	AS	"Siren",
    				IF	(	"CLIENT"."Contact10_Email"	LIKE	'%@%'	,	"CLIENT"."Contact10_Email"	,	
    					IF	(	"CLIENT"."Contact11_Email"	LIKE	'%@%'	,	"CLIENT"."Contact11_Email"	,	
    						IF	(	"CLIENT"."Contact20_Email"	LIKE	'%@%'	,	"CLIENT"."Contact20_Email"	,	
    							IF	(	"CLIENT"."Contact21_Email"	LIKE	'%@%'	,	"CLIENT"."Contact21_Email"	,	
    								IF	(	"CLIENT"."Adresse1_Adresse"	LIKE	'%@%'	,	"CLIENT"."Adresse1_Adresse"	,	
    									IF	(	"CLIENT"."Contact10_Nom"	LIKE	'%@%'	,	"CLIENT"."Contact10_Nom"	,	
    										IF	(	"CLIENT"."Contact11_Nom"	LIKE	'%@%'	,	"CLIENT"."Contact11_Nom"	,	
    				''	)	)	)	)	)	)	)	"Email",
    				IF	(	"CLIENT"."Adresse1_Adresse"	LIKE	'%www%'	,	"CLIENT"."Adresse1_Adresse"	,
    					IF	(	"CLIENT"."Adresse1_Ville"	LIKE	'%www%'	,	"CLIENT"."Adresse1_Ville"	,	
    						IF	(	"CLIENT"."Contact10_URL"	LIKE	'%www%'	,	"CLIENT"."Contact10_URL"	,	
    							IF	(	"CLIENT"."Contact11_URL"	LIKE	'%www%'	,	"CLIENT"."Contact11_URL"	,	
    				''	)	)	)	)	"Site Web",
    				'2015' AS "Tarif",
    				"MODEREGL"."Reglement"	AS	"Condition Reglement",
    				'' AS 	"Activite",
    				'' AS	"Type",
    				''	AS	"Nombre BL",
    				(SELECT	COUNT(*)	FROM	"FACTURE"	WHERE	"FACTURE"."Client" = "CLIENT"."CODE"	AND "FACTURE"."Facture" <> 0	) AS "Nombre Factures"
     
    FROM
     
    				"CLIENT"
    				LEFT OUTER JOIN "MODEREGL"
    					ON	"CLIENT"."Reglement"	=	"MODEREGL"."Code"
     
    GROUP BY "CLIENT"."Code"
    Qui fonctionne jusqu’à mes "bricolage pour la dernière ligne du SELECT.

    Je pense que c'est le group by qui est mal placé mais la, vu mes compétences (ou plutôt mon incompétence de débutant), je seche...

    J’espère avoir pu vous faire comprendre ma problématique et serai reconnaissant et friand de vos précieux conseils.

    Merci d'avance pour votre aide.

    Cordialement

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Le plus facile, c'est de mettre ta premiere requete dans le from de ta deuxieme...
    Attention, c'est le plus facile, mais c'est loin d'etre le plus optimisé. Mais je pense que vu que tu débutes, tu comprendras peut etre plus facilement cette solution :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    SELECT 
     
    				"CLIENT"."Code"	AS	"Info EBP",
    				"CLIENT"."CODE"	AS	"Code Tiers",
    				UPPER(SUBSTRING("CLIENT"."RaisonSociale" , 1 , 20))	AS "Nom Reduit",
    				IF("CLIENT"."LastFacture_Date" = NULL() , "CLIENT"."OuvertLe" , "CLIENT"."LastFacture_Date" ) "Date Creation",
    				"CLIENT"."Compte"	AS	"Compte Auxiliaire",
    				"CLIENT"."NumTVA"	AS	"Numero TVA",
    				"CLIENT"."Siret"	AS	"Siret",
    				SUBSTRING("CLIENT"."Siret",1,9)	AS	"Siren",
    				IF	(	"CLIENT"."Contact10_Email"	LIKE	'%@%'	,	"CLIENT"."Contact10_Email"	,	
    					IF	(	"CLIENT"."Contact11_Email"	LIKE	'%@%'	,	"CLIENT"."Contact11_Email"	,	
    						IF	(	"CLIENT"."Contact20_Email"	LIKE	'%@%'	,	"CLIENT"."Contact20_Email"	,	
    							IF	(	"CLIENT"."Contact21_Email"	LIKE	'%@%'	,	"CLIENT"."Contact21_Email"	,	
    								IF	(	"CLIENT"."Adresse1_Adresse"	LIKE	'%@%'	,	"CLIENT"."Adresse1_Adresse"	,	
    									IF	(	"CLIENT"."Contact10_Nom"	LIKE	'%@%'	,	"CLIENT"."Contact10_Nom"	,	
    										IF	(	"CLIENT"."Contact11_Nom"	LIKE	'%@%'	,	"CLIENT"."Contact11_Nom"	,	
    				''	)	)	)	)	)	)	)	"Email",
    				IF	(	"CLIENT"."Adresse1_Adresse"	LIKE	'%www%'	,	"CLIENT"."Adresse1_Adresse"	,
    					IF	(	"CLIENT"."Adresse1_Ville"	LIKE	'%www%'	,	"CLIENT"."Adresse1_Ville"	,	
    						IF	(	"CLIENT"."Contact10_URL"	LIKE	'%www%'	,	"CLIENT"."Contact10_URL"	,	
    							IF	(	"CLIENT"."Contact11_URL"	LIKE	'%www%'	,	"CLIENT"."Contact11_URL"	,	
    				''	)	)	)	)	"Site Web",
    				'2015' AS "Tarif",
    				"MODEREGL"."Reglement"	AS	"Condition Reglement",
    				'' AS 	"Activite",
    				'' AS	"Type",
    				''	AS	"Nombre BL",
    				NB
     
    FROM
     
    				"CLIENT" 
    				LEFT OUTER JOIN "MODEREGL"
    					ON	"CLIENT"."Reglement"	=	"MODEREGL"."Code"
    				INNER JOIN 
    				(	SELECT	"CLIENT"."Code" as B_CODE,	
    					COUNT(*) NB
    					FROM	"FACTURE",	
    							"CLIENT"	
    					WHERE "FACTURE"."Client" = "CLIENT"."CODE" 
    					AND "FACTURE"."Facture" <> 0 
    					GROUP BY "CLIENT"."Code"
    				) B on B_CODE = "CLIENT"."Code"
     
    GROUP BY "CLIENT"."Code"
    J'ai créé une sous table que j'appelle B qui reprend ta requete d'avant, et le joins avec le reste sur le code client...
    NB est le champ count(*) que tu as calculé precédement...

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour à tous,

    bstevy merci beaucoup pour cette réponse.
    Dans un premier temps, j'ai testé votre requête avec un copier/coller sans chercher à comprendre J'ai une erreur de mon interpreteur SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ODBC Error: SQLSTATE = 37000, Native error code = 0 
    Syntax Error: ",
     				''	AS	"Nombre BL",
     				NB AS "Nombre Factures"
     
     FROM
     
     				"CLIENT" 
     				LEFT OUTER JOIN "MODEREGL"
     					ON	"CLIENT"."Reglement"	=	"MODEREGL"."Code"
     				LEFT OUTER JOIN 
     				(	SELECT<< ???

    Je creuse pour mieux comprendre la requête que vous proposez. Mais j'ai l'impression que mon interface Pervasive (qui est en V8 alors qu'une V12 est sortie - Mais avec le logiciel EBP, je ne peux évoluer) interprète pas certains éléments du code.

    Je pense qu'elle a besoin d'une instruction pour indiquer la sous table B.

    J'ai tenté de passer le INNER joint en LEFT, je ne pense pas que cela soit un gros problème (Je voudrais sortir tous mes clients même ceux qui n'ont pas de factures)

    Je me renseigne sur les sous tables.

    Si vous avez d'autres conseils, je suis preneur.

    Merci pour votre implication a ma problématique.

    Cordialement

  4. #4
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    D'apres ce que je vois, vous utilisez un paquet de double quotes (")... ce qui n'est pas quelque chose qu'on l'on fait avec du SQL classic... peut etre alors faut il mettre entre double quote certains element de ma requete. genre,
    NB, B, B_CODE... tous ces elements que j'ai créé qui ne sont pas du code SQL merite peut etre leur double quote... mais je connais pas assez votre produit pour etre sur desolé


    Le passage en left est effectivement une bonne idée et ne devrait pas poser de probleme.

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Merci encore pour votre réponse.

    J'ai en effet tenté les quotes, c’était une très bonne idée. Mais cela n'a pas change l'erreur.

    Je creuse mais n'ai pas d'avancement pour le moment.

    Si quelqu'un connait un peu le Pervasive SQL (utilisé par EBP) je serai preneur.

    Cordialement

  6. #6
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    ce que je viens de trouver en cherchant l'erreur :
    Looking at the docs for PSQL 2000, it doesn't appear sub queries are supported in joins like you're doing.
    From http://www.pervasive.com/library/doc.../engref60.html
    donc, c'est le sous select qui lui plait pas à priori ... il va donc falloir faire autrement.

    ca veut dire joindre avec la table qui manque, en left, et group by tous les champs sauf le count(*)... bon courrage


    Ou alors, vous avez le moyen de créer des vues ? je sais pas si c'est possible, mais creer la vue, et l'utiliser en tant que table dans la requete à la place du sous select... ca m'etonnerait que ce soit possible, mais on sait jamais.

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Désolé pour ce temps de réponse un peu long,

    Merci beaucoup pour cette information. J'ai la possibilité de créer des vues. Je fais un test et vous tiens au courant.

    Sinon je fais également un test avec la jointure en left. et group by et vous tiens également au jus.

    Je tiens à sincèrement vous remercier pour l'aide que vous m'apportez. Pas toujours facile de débuter sans soutien.

    Cordialement



    Sinon

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Petit Update.

    En effet en utilisant la vue, j'ai un message d'erreur :

    ODBC Error: SQLSTATE = S1000, Native error code = 0
    Grouped view joins are not supported.
    Il ne s'est pas laissé tromper par le vue.

    Je creuse sur la seconde piste.

    PS : désolé pour la citation inutile.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Update pour la seconde piste.

    La requête est en cours. Pour le moment pas d'erreur mais je crains le time out de pervasive.

Discussions similaires

  1. [AC-2003] Requête avec si "imbriqué"
    Par Fcnaatao dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/04/2012, 17h01
  2. optimisation de requête sql avec select imbriquées
    Par yassine_le_boss dans le forum SQL
    Réponses: 6
    Dernier message: 02/11/2010, 23h12
  3. Requête avec select imbriqué
    Par Isiker dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/08/2010, 18h45
  4. [PDO] Fetch avec while imbrique et requête preparée
    Par mensoif dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/06/2009, 13h36
  5. [Delphi6,Access] Requête update avec select imbriqué
    Par magicstar dans le forum Débuter
    Réponses: 3
    Dernier message: 30/03/2009, 20h40

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