Vous n'êtes pas identifié(e).
Pages : 1
bonjour à tous
je veux creer une vue qui n'amène que 1 et 0 comme valeur ; 1 pour toutes les lignes où la colonne concernée de la table contient 1 et 0 dans tous les autres cas ,pour toutes les lignes de la table . c'est à dire , ma vue portera sur une colonne A de ma table , elle amènera 1 pour toutes les lignes où A = 1 et 0 pour toutes autres valeurs contenant A . j'ai fait assez de tentative pour cette requette , car j'ai tenté d'utiliser "si" , mais ça marche pas ; aidez moi s'il vous plait .
merci d'avance
Hors ligne
http://docs.postgresqlfr.org/8.3/functi … ional.html
http://www.postgresql.org/docs/8.3/inte … ional.html
Avec un exemple assez parlant:
SELECT * FROM test;
a
---
1
2
3
SELECT a,
CASE WHEN a=1 THEN 'one'
WHEN a=2 THEN 'two'
ELSE 'other'
END
FROM test;
a | case
---+-------
1 | one
2 | two
3 | other
Donc ici un simple CASE nom_colonne WHEN 1 THEN 1 ELSE 0 END fait l'affaire.
Hors ligne
votre exemple est vraiment parlant , mais malhereusement il traite pas trop ma question;
je ne veux avoir dans ma colonne résulat que des 1 et des 0 selon que la colonne sur laquelle porte la vue, contient 1 ou autre valeur . 1 pour les lignes qui contiennent 1 et 0 pour les lignes qui contiennent autre valeur.
j'ai besoin de votre aide encore si possibles s'il vous plait
Dernière modification par bennkabazz (17/12/2008 01:51:55)
Hors ligne
postgres=# CREATE TABLE test (id SERIAL PRIMARY KEY, a INT, b INT);
NOTICE: CREATE TABLE will create implicit sequence "test_id_seq" for serial column "test.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE
postgres=# INSERT INTO test (a, b) SELECT ROUND(RANDOM() * 3), ROUND(RANDOM() * 10) FROM generate_series(0, 9);
INSERT 0 10
postgres=# SELECT * FROM test;
id | a | b
----+---+---
1 | 0 | 4
2 | 2 | 5
3 | 1 | 6
4 | 0 | 3
5 | 1 | 3
6 | 2 | 7
7 | 1 | 1
8 | 0 | 3
9 | 2 | 9
10 | 2 | 8
(10 rows)
postgres=# CREATE VIEW test_computed AS SELECT id, CASE a WHEN 1 THEN 1 ELSE 0 END as a, b FROM test;
CREATE VIEW
postgres=# SELECT * FROM test_computed ;
id | a | b
----+---+---
1 | 0 | 4
2 | 0 | 5
3 | 1 | 6
4 | 0 | 3
5 | 1 | 3
6 | 0 | 7
7 | 1 | 1
8 | 0 | 3
9 | 0 | 9
10 | 0 | 8
(10 rows)
Et si ça ne répond toujours pas à la question, il faudrait nous donner quelques exemples réels: données en entrée, et résultats voulus en sortie.
Hors ligne
bonjour
merci d'abord pour votre assistance.
c'est à dire je veux un truc comme ça :
colonne A de ma table ={1, 3,7,9,0,1,5,1,6,1}
si je fais
create view mavue (colonne1) as select colonne2 from matable machin ...............;
et en plus si je fais
select * from mavue;
je veux avoir colonne1={1,0,0,0,0,1,0,1,0,1}
partout où y avait 1 dans la colonne2 de ma table reste à 1 , mais partout où y avait autre valeur sont transformé à 0.
merci d'avance
Dernière modification par bennkabazz (17/12/2008 13:39:42)
Hors ligne
Il suffisait d'utiliser la première réponse de luddic et de l'adapter à ton besoin :
CREATE VIEW mavue (colonne1) AS
SELECT
CASE WHEN a=1 THEN 1
ELSE 0
END
FROM matable;
Guillaume.
Hors ligne
merci beaucoup à vous tous ; il fait mon affaire .
très sympa
Dernière modification par bennkabazz (18/12/2008 23:53:32)
Hors ligne
Juste une remarque...
Lorsque vous posez une question sur les forums, ne vous attendez pas systématiquement à obtenir la réponse idéale à votre question. La réponse qui fera que vous n'avez même pas à réfléchir un tantinet pour l'adapter à votre besoin.
Lorsque vous utilisez les forums ou les listes de discussion, ou irc, on attend de vous que vous posiez une question qui explique clairement votre besoin et votre problème, et quand retour vous sachiez analysez une réponse et l'adapter à votre besoin.
Il ne faut pas croire que les gens qui donnent de leur temps pour vous aider sont à votre service.
Stéphane Schildknecht
Conseil, formations et support PostgreSQL
http://www.loxodata.com
Hors ligne
bonjour
il marche bien cette requête de création de la vue car il renvoi le résultat désireux , mais parcontre il renvoie 36 enregistrements étant donné que j'en ai 6 dans ma table , j'ai l'impression qu'il multiplie les 6 enregistrements par 6 pour en faire à 36 ; aidez moi s'il vous plait .
voici la requête :
CREATE VIEW mavue (colonne1) AS
SELECT
CASE WHEN a=1 THEN 1
ELSE 0
END
FROM matable;
Hors ligne
Excuse-moi, mais tes questions commencent à devenir du grand n'importe quoi. Tu as six éléments dans ta table, la vue en renvoie 36 et t'imagines que PostgreSQL multiplie les enregistrements par 6. Moi, je crois qu'il en a ajouté 30, juste pour se marrer. Merde, c'est n'importe quoi.
Le nombre d'enregistrements renvoyés par la vue correspond au nombre d'enregistrements de la table. Point.
Guillaume.
Hors ligne
non vous n'avez pas à vous excusé , je ne prends pas en mal , quand on est à la recherche du savoir on se plie ;
je suis assez étonné aussi par le résultat , mais peut être , comme je joins la vue calculée à la vue qui a permis à son calcul, l'erreur doit se trouver à ce niveau , car , si je crée une table simple de 6 enregistrement et appliquer la requête , il renvoie 6 enregistrement comme vous l'avez dit .
je suis encore désolé
merci pour vos assistances
Hors ligne
Bonjour. J'ai un soucis sur une requête conditionnelle que je ne parviens pas à réaliser. Voici mon cas : Je souhaite créer une vue qui contient des information de plusieurs tables, dans 2 bases de données (avec un dblink).
Tout fonctionne, sauf que le résultat n'est pas celui que j’attends : j'ai 40 communes, dans lesquelles je souhaite faire apparaitre, pour l'ensemble des communes, les informations souhaitées. Dans cet exemple, je veux faire apparaitre la somme des longueurs de tronçon d'autoroute, par commune. Seulement, toutes mes communes ne sont pas traversées par l'autoroute. Résultat lorsque j'applique cette requête, apparaissent seulement les information sur les communes qui ont une longueur totale > 0. Pour els autres communes, je perd tous les enregistrements.
CREATE OR REPLACE VIEW view_test3
AS SELECT
id,
geom,
code_insee,
long_voirie_a
FROM
info_com,
dblink('hostaddr=xxx port=xxx dbname=xxx user=xxx password=xxx', 'select code_insee, sum("long_carto_troncon") FROM bd_adresse WHERE "domanialite" = ''Autoroute'' GROUP BY code_insee ORDER BY code_insee')as foo (code integer, long_voirie_a double precision )
WHERE
code_insee=foo.code
GROUP BY
code_insee, id, geom, commune, long_voirie_a
;
J'ai donc essayé avec un SELECT CASE, de la manière suivante :
CREATE OR REPLACE VIEW view_test3
AS SELECT
id,
geom,
code_insee,
long_voirie_a,
CASE
WHEN long_voirie_a <> 0 THEN long_voirie_a
ELSE long_voirie_a = NULL
END
FROM
info_com,
dblink('hostaddr=xxx port=xxx dbname=xxx user=xxx password=xxx', 'select code_insee, sum("long_carto_troncon") FROM bd_adresse WHERE "domanialite" = ''Autoroute'' GROUP BY code_insee ORDER BY code_insee')as foo (code integer, long_voirie_a double precision )
WHERE
code_insee=foo.code
GROUP BY
code_insee, id, geom, commune, long_voirie_a
;
Mais rien à faire, j'ai toujours ce champ qui me contraint à ne garder que les enregistrements qui sont traversés par une autoroute.
Voyez-vous ou j'ai pu commettre une erreur ? Merci beaucoup.
Hors ligne
À moins que je n'ai pas compris ce que vous vouliez faire, il faudrait placer le CASE au niveau du sum.
Guillaume.
Hors ligne
Pages : 1