PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 PL/pgSQL » JOIN sur une partie du champ » 19/10/2014 11:48:59

CHR
Réponses : 1

Bonjour,

J'ai une table qui contient par exemple trois champs : ID, User, Roles_ID.
Une deuxième qui contient les Roles : Roles_ID, Détail

Dans la table 1, un user peut avoir plusieurs roles, séparés par une virgule.
Exemple : "1; chr; 1,3,7", "2; bvh; 2,7", "3; lmh; 7"

Dans la table 2, les roles listés avec leurs id.
Exemple : "1; Sortir", "2; Rentrer", "3; Manger", "4; Dormir", "5; Travailler", "6; Voyager", "7; Etudier"

J'ai besoin d'une query qui me donne :
1 - Sortir - 1 (chr)
2 - Rentrer - 1 (bvh)
3 - Manger - 1 (chr)
4 - Dormir - 0 (-)
5 - Travailler - 0 (-)
6 - Voyager - 0 (-)
7 - Etudier - 3 (chr, bvh, lmh)

J'imagine que c'est tout bête, j'avais pensé à un JOIN mais je ne sais pas si le JOIN accepte autre chose qu'un = et si oui, comment le formuler.

D'avance merci pour votre aide !
Bon dimanche !
chr

#2 Re : PL/pgSQL » [RESOLU] VERLAPS fonction exclut une date » 20/09/2014 17:51:04

CHR

Cool, sauf que l'on tourne en 9.1.4... c'est déjà mieux qu'en janvier, nous étions en début d'année à la 8.1 !

Pour ceux qui n'ont pas non plus la 9.2, j'ai utilisé un CASE WHEN dans le OVERLAPS :
(case when date_begin = '2014-06-30' then date_begin - interval '1 day' else date_begin end, case when date_end is null then '2014-06-30' else date_end ::date end)

Et ça fonctionne très bien, mais évidement c'est un peu plus long et moins facile pour le contrôle.
Merci encore !

#3 Re : PL/pgSQL » [RESOLU] VERLAPS fonction exclut une date » 20/09/2014 13:05:45

CHR

Merci beaucoup, toujours aussi rapides, c'est cool !
Entre-temps je travaille sur les dates pour les comparer et, le cas échéant, réduire la date de début d'un jour.
En query seul ça fonctionne mais comme c'est imbriqué, c'est pas encore gagné, mais puisque j'ai réussi à faire fonctionner la sous-requête, rien n'est désespéré !
Encore merci !
Je mets le point résolu.

#4 PL/pgSQL » [RESOLU] VERLAPS fonction exclut une date » 20/09/2014 12:30:24

CHR
Réponses : 4

Bonjour,

De retour dans les query Postgresql, j'ai utilisé l'excellente fonction "OVERLAPS" comme suit :

where
(DATE '2014-06-01', DATE '2014-06-30') OVERLAPS
(c3.date_begin, case when c3.date_end is null then '2014-06-30' else c3.date_end end)

Par contre, j'ai un enregistrement où date_begin est '2014-06-30' et date_end '2014-08-25', cet enregistrement est exclu alors qu'il est dans ma range.
Aurai-je manqué un paramètre overlaps pour dire de prendre tout y compris les limites début, fin indiquées ?

Merci pour votre aide,
Chr

#5 PL/pgSQL » Employés mais seulement leur dernier contrat » 05/04/2014 15:08:57

CHR
Réponses : 1

Bonjour,
Je recommence un peu de postgresql et je n'arrive pas à obtenir la liste des derniers contrats des employés. Pourtant la table contrat est simple et contient un id du contrat + un id de l'employé, j'essaie

select d.is, d.full_name, s.id, s.date from employee d
where
d.id = (select max(S.id) from contrats C
left join employee S on (C.dossier_id = C.id))

le résultat de me renvoie pas de lignes....
Merci pour votre aide,
CHR

#6 PL/pgSQL » group by * .... c'est possible ? » 27/01/2014 22:32:21

CHR
Réponses : 1

Bonsoir, toujours la newbie et je prépare ce soir un query super simple :

select distinct * from partner.partner p
INNER JOIN hr.hr_contrat h ON h.collab_id = p."id"
where extract(year from h.birth_date) < '2014'
group by ....

ça fonctionne sauf que comme je fais un lien sur une table qui contient de multiples enregistrements pour le même id, j'ai quand même plusieurs lignes.
je pensais solutionner la question avec un group by mais... j'ai pas envie d'écrire la liste nombreuse de champs qui compose la table partner !

Vous avez une idée pour m'aider ?
Merci,
chr

#7 Sécurité » Utilisateur qui ne doit accéder qu'à une partie de la base » 16/01/2014 22:21:23

CHR
Réponses : 1

Bonjour,
Je travaille toujours sur un projet de reporting et j'ai toutes mes réponses sur la connexion ODBC, la seule question est: comment ne pas utiliser un utilisateur qui voit tout !
Oui, j'ai essayé de créer un user lambda "rep" (pour reporting) et dans la base de créer un schéma "reporting" dans lequel j'ai mis des vues qui elles appartiennent à postgresql et donc peuvent interroger les objets sans restriction.
Je grant les droits select à "rep" sur ce shéma et j'essaie de l'utiliser depuis XL via mes drivers ODBC mais il apparaît que comme "rep" n'a pas de droit sur les sous objets, il ne lui est pas possible de voir le contenu de cette vue... ce doit être du basic (je suis toujours newbie) mais si vous aviez une piste de résolution, ce serait top pour moi.
Merci !
Bonne soirée,
chr

#8 Re : PL/pgSQL » [RESOLU] SELECT WHERE avec différents critères » 16/01/2014 22:15:51

CHR

Bonjour,
J'ai eu la réponse à ma question, en fait c'était plutôt du côté XL car il suffisait de mettre plusieurs "variables", soit "?" et de pointer vers la même cellule.
Sinon, pour le ou tout ou le filtre, le développeur m'a donné la proposition suivante (variable=-1 ou variable=x), comme les deux sont retranscrits dans XL comme (variable=? ou variable=?), je pointe les deux ? sur la même cellule et je saisis "-1" lorsque je souhaite ne pas avoir de filtres... coool.
Je mets donc le point en [RESOLU]
Prochain post sur les questions de droits... je ne sais pas si ce sera le lieu où si je trouve un topic plus approprié.
A bientôt ;-)

#9 Re : PL/pgSQL » [RESOLU] SELECT WHERE avec différents critères » 07/01/2014 07:19:09

CHR

Si je prends la base tuto, pagila, j'imagine que je souhaite interroger la table film sur le champs rental_duration:

Select title, description, release_year where rental_duration in(?)

le ? est interprété par MS-Query (via Excel) comme un paramètre que l'utilisateur devra saisir. Une fois je veux toutes les lignes où le rental_duration est 3, une autre fois toutes celles où il est 3 et 7 et une autre fois encore toutes les lignes quel que soit la durée.

Comment écrire la requête pour que le "in" renvoie selon le cas, le 1 ou n critères ou toutes les données. Sachant que postgresql attends les multi-arguments entre apostrophe et séparés par des virgules (in('3', '6', '7')), comment coder la requête pour passer ces n arguments de l'interface ou utilisateur et quel argument donner lorsque le in doit contenir toutes les occurrences ?

Je sais, c'est une question de newbie mais... malheureusement j'en suis une !
Et encore une fois merci et chapeau pour votre suivi du forum qui est excellent, ça donne envie de passer le cap de la newbie !!

#10 Re : PL/pgSQL » [RESOLU] SELECT WHERE avec différents critères » 06/01/2014 23:59:53

CHR

pas vraiment, ms query permet seulement le "?", la question est de comment transmettre ou poser un multi-query à postgresql. Une seule variable, multiple statements, c'est comment ?

#11 Re : PL/pgSQL » [RESOLU] SELECT WHERE avec différents critères » 06/01/2014 22:23:38

CHR

Bonsoir,
Mon problème c'est que je vous ai soumis trois requêtes qui fonctionnent parfaitement individuellement mais que je ne sais pas comment traiter ces 3 cas dans une seule requête et un seul ? (ms-query paramètre).
Plus précisément, je ne sais pas comment transformer ou créer une requête qui EN MEME TEMPS puisse ramener tous les enregistrements (pas de WHERE condition - cas 3), plusieurs filtres (IN(xx) selection - cas 2) et une condition (= cas 1).
Merci pour votre aide et bonne soirée,
chr

#12 PL/pgSQL » [RESOLU] SELECT WHERE avec différents critères » 05/01/2014 08:42:25

CHR
Réponses : 9

Bonjour à tous, encore une petite question...

J'ai une requête que je récupère dans XL (ODBC + MS-QUERY) et qui fonctionne très bien, simplement j'ai un souci avec la syntaxe du query lorsque je veux récupérer toutes les données, un peu comme si je n'avais pas mis la condition.

Par exemple:
SELECT * from job.job_contrats where job.job_contrats.type_id = '1'

peut devoir devenir
SELECT * from job.job_contrats where job.job_contrats.type_id in('1','12','14')
voire
SELECT * from job.job_contrats
si l'utilisateur veut voir tous les types de contrats

Merci pour l'aide si vous avez une idée.
chr

#13 Re : PL/pgSQL » [RESOLU] - un peu de mal avec les alias de tables... ERROR » 04/01/2014 19:17:37

CHR

Cool, ça fonctionne si l'on met les noms, les alias, les ordres justes !
Merci encore pour votre aide :-)

#14 Re : PL/pgSQL » [RESOLU] - un peu de mal avec les alias de tables... ERROR » 04/01/2014 01:34:23

CHR

c'est bien une autre erreur qui ressort... j'ai l'impression que ça tourne en boucle car l'ordre n'est pas le bon...


[Err] ERROR:  missing FROM-clause entry for table "hr_contrat"
LINE 28:         inner JOIN job.hr_contrat_type ON hr_contrat.type_...

#15 Re : PL/pgSQL » [RESOLU] - un peu de mal avec les alias de tables... ERROR » 04/01/2014 01:30:53

CHR

J'essaie de suite et vous dit le résultat !
(cela dit... c'est le forum où - tous domaines confondus - j'ai eu les réponses les plus rapides, merci !)

#16 PL/pgSQL » [RESOLU] - un peu de mal avec les alias de tables... ERROR » 04/01/2014 00:32:38

CHR
Réponses : 6

Bonsoir,

Toujours en train d'essayer de sortir de l'état de newbie PostGresql, voici mon nouveau défi en cette réponse sibylline du système :
[Err] ERROR:  relation "g" does not exist
alors que l'alias g est défini dans la clause FROM, par contre, comme elle est aussi utilisée dans le join, j'ai un doute si je dois utiliser "INNER JOIN g ON..." car j'ai l'impression que ce "g" n'est pas compris ou bien... j'avoue que j'ai du mal à m'y mettre.. oops.
Merci pour votre aide et bonne soirée

SELECT
                job.job_departement.departement_name as "Département",
                p.partner_firstname as "Prénom",
                p.partner_lastname as "Nom",
                array_agg(g.contrat_taux) as "Taux",
                p.collab_initials as "Initiales",
                p.partner_tel_prof as "Tel",
                p.partner_mail_prof as "Mail",
                array_agg(job.hr_contrat_type.type_name) as "Types de Contrats",
                job.hr_function.function_name,
                job.job_departement.departement_cc_account,
                min(contrat_begin) as "Première date",
                max(contrat_end) as "Dernier contrat",
                (select count(*) from job.hr_contrat where job.hr_contrat.id = p.id) as NbTous,
                max(g.id),
                array_agg(job.hr_function.function_name)

FROM partner.partner p, job.hr_contrat as g
        INNER JOIN job.hr_contrat_type ON g.type_id = job.hr_contrat_type."id"
                INNER JOIN g ON g.collab_id = p."id"
                INNER JOIN job.hr_function ON g.function_id = job.hr_function."id"
                INNER JOIN job.job_departement ON job.hr_contrat.departement_id = job.job_departement."id"

group by job.job_departement.departement_name,
                p.partner_firstname,
                p.partner_lastname,
                p.collab_initials,
                p.partner_tel_prof,
                p.partner_mail_prof,
                job.hr_function.function_name,
                job.job_departement.departement_cc_account

ORDER BY job.job_departement.departement_name ASC, p.partner_firstname ASC;

#18 PL/pgSQL » [RESOLU] - Equivalent "over (PARTITION BY..." pour la version 8.3.19 » 02/01/2014 14:24:54

CHR
Réponses : 2

Je viens de réaliser que le serveur sur lequel je voulais utiliser les solutions que vous m'avez proposées est dans la version 8.3.19 et que cette  version n'inclut pas le fenêtrage... les over (PARTITION BY sont donc inutilisables, je ne sais pas si nous avons prévu de migrer et vu les soucis annoncés pour passer la 8.3, bref, auriez-vous une alternative à cette solution qui soit utilisable dans la 8.3.19 ?
D'avance merci,
chr

#19 Re : PL/pgSQL » [RESOLU] - SELECT pour choisir une première occurence en fonction » 02/01/2014 13:53:23

CHR

Impressionnée par les administrateurs de ce site, ça fonctionne parfaitement bien.
Que 2014 vous apporte des questions sympa et plein de bonnes choses et encore MERCI pour l'aide !

#20 Re : PL/pgSQL » [RESOLU] - SELECT pour choisir une première occurence en fonction » 02/01/2014 13:17:52

CHR

merci ! Et si je souhaite obtenir le titre lié au plus film_id ?

#21 PL/pgSQL » [RESOLU] - SELECT pour choisir une première occurence en fonction » 02/01/2014 12:33:11

CHR
Réponses : 4

Merci encore pour la réponse super rapide à mon premier post tout à l'heure et puisque j'y ai aussi planché sans grand succès, toujours sur pagila mais cette fois sur la table film où je souhaiterai obtenir le premier titre disponible pour chacun des ratings existants (G, PG-13, NC-17). Dans MS-Access j'utilise la fonction d'agrégation "last(title)" mais je sais que "last" n'existe pas dans pg.

rating      Nb         Title (film_id)
G            200        Bunch Minds (107)
PG-13      187        Butch Panther (108)   
NC-17     299         Cabin Flash (110)

Voilà et encore merci pour votre aide,
chr

#22 Re : PL/pgSQL » [RESOLU] - SELECT avec un total général, par staff_id et par mois » 02/01/2014 12:15:47

CHR
gleu a écrit :

Ça devrait ressembler à ceci :

SELECT DISTINCT ON (staff_id, extract(month FROM payment_date))
  staff_id, extract(month FROM payment_date),
  count(*) over (PARTITION BY staff_id, extract(month FROM payment_date)) AS TotMois,
  count(*) over (PARTITION BY staff_id) AS Total,
  count(*) over () AS TotGeneral
FROM payment;

Génial !!! Plus que ressembler, c'est EXACTEMENT ça... et dire que j'ai cherché pendant des heures, merci !!!!

#23 Re : PL/pgSQL » [RESOLU] - SELECT avec un total général, par staff_id et par mois » 02/01/2014 11:46:46

CHR

Merci !
J'ai utilisé la BD pagila et la table payment, seule différence c'est que j'ai utilisé EXTRACT(month from payment_date) pour obtenir le mois et que j'ai le chiffre et non l'abréviation du mois. Mais je prépare une table pour le post.

#24 PL/pgSQL » [RESOLU] - SELECT avec un total général, par staff_id et par mois » 02/01/2014 11:36:55

CHR
Réponses : 4

Bonjour fully newbie dans le monde de Postgresql j'essaie d'obtenir le résultat suivant:

Staff_ID     Mois    TotMois     Total       TotGeneral
1                Jan         3            10              41
2                Jan         4            10              41
3                Jan         3            10              41
1                Fev         9            19              41
2                Fev         9            19              41
3                Fev         1            19              41
1                Mar         6            12              41
2                Mar         5            12              41
3                Mar         1            12              41

J'ai utilisé la BD d'exemple pagila (tutosql), la table ici comporterait 41 lignes, le but étant d'obtenir des sous-totaux (ici un count) dissociés en fonction de groupements ou de criètres à choix, ici Staff ID et Mois.

J'ai essayé les subquery (select dans un select) mais le hic est que la colonne Total renvoie toujours plusieurs lignes (évidement une par mois) et que donc la sous-requête me ramène une erreur...
Merci d'avance pour votre aide et bonne année !
chr

Pied de page des forums

Propulsé par FluxBB