Deutsch   English   Français   Italiano  
<87r1523i12.fsf@izac.org>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!fdn.fr!news.ortolo.eu!news.izac.org!reader
From: Benoit Izac <use.reply.to@INVALID.ADDRESS>
Newsgroups: fr.comp.lang.python
Subject: Re: Transformer une BD .sqlite en .js avec python version 3.8
Date: Mon, 09 May 2022 16:19:37 +0200
Message-ID: <87r1523i12.fsf@izac.org>
References: <UNydnQ0sEcMoaej_nZ2dnUU7_83NnZ2d@giganews.com>
	<871qx34yrn.fsf@izac.org>
	<bdidnQWQmvHJMuX_nZ2dnUU7_8zNnZ2d@giganews.com>
Reply-To: benoit.izac@free.fr
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Injection-Info: keg.izac.org;
	logging-data="1062954"; mail-complaints-to="usenet@izac.org"
Bytes: 2821
Lines: 60

Bonjour,

Le 09/05/2022 à 08:06, msamandine a écrit dans le message
<bdidnQWQmvHJMuX_nZ2dnUU7_8zNnZ2d@giganews.com> :

>> SELECT nb_enfants, genre,
>> SUM(CASE WHEN articles = 1 THEN nb END) '1_article',
>> SUM(CASE WHEN articles = 2 THEN nb END) '2_articles',
>> SUM(CASE WHEN articles = 3 THEN nb END) '3_articles',
>> SUM(CASE WHEN articles = 4 THEN nb END) '4_articles'
>> FROM (
>> SELECT nb_enfants, genre, articles, count(*) nb
>> FROM t
>> GROUP BY nb_enfants, genre, articles
>> )
>> GROUP BY nb_enfants, genre;
>
> Merci pour cette solution. Par contre, je cherchais un bout de code
> qui puisse générer ce genre de table automatiquement, sans que l'on
> précise à chaque fois "article = 4", article = 3, etc. En effet, la BD
> que j'ai mis en ligne n'est qu'un extrait. En réalité, j'ai plus de
> 900 entrées. Est-il possible d'automatiser ce morceau de code ?
>
> Et, pour ce qui est de Python, c'est juste que j'intègre ensuite ce
> bout de code à mon code Python :)

À ma connaissance sqlite n'a pas de fonction pivot ou crosstab donc
autant le faire en python (pas super testé donc à corriger si
nécessaire) :

import sqlite3
con = sqlite3.connect('test.sqlite3')
cur = con.cursor()
sep = '|'
d = {}
max_articles = 0

for nb_enfants, genre, articles, nb in cur.execute('''
  SELECT nb_enfants, genre, articles, count(*) nb
  FROM t
  GROUP BY nb_enfants, genre, articles'''):
    if articles > max_articles: max_articles = articles
    d.setdefault((nb_enfants, genre), {})[articles] = nb

print('nb_enfants', 'genre', sep=sep, end=sep)
for i in range(max_articles):
    print(f'{i+1}_article{"s" if i+1 > 1 else ""}', end=sep)
print()

for k, v in d.items():
    nb_enfants, genre = k
    print(nb_enfants, genre, sep=sep, end=sep)
    for i in range(max_articles):
        print(v.get(i+1, 0), end=sep)
    print()

Là c'est juste de l'affichage mais je pense que tu pourrais directement
générer ton graphique.

-- 
Benoit Izac