Transforme n’importe quel résultat de requête, sélection de la grille ou table dans Beekeeper Studio en tableau croisé dynamique, puis partage-le en classeur Excel, PDF, image, Markdown, CSV, HTML ou JSON.

Enregistré dans l’environnement de dev du plugin avec 5000 commandes d’exemple. Légèrement accéléré.
Fonctionnalités en bref
| Glisser-déposer | Lignes, Colonnes, Valeurs et Filtres, comme un tableau croisé de tableur |
| 11 agrégations | Nombre, nombre distinct, somme, moyenne, min, max, médiane, écart type, variance, premier, dernier |
| % du total | Affiche n’importe quelle valeur en part du total général, de ligne ou de colonne |
| Regroupement par date | Année, trimestre, mois, semaine, jour, heure, mois de l’année, jour de la semaine |
| Filtres et tri | Choisis les valeurs avec recherche et décomptes ; trie A→Z, Z→A ou par valeur |
| Mise en page | Totaux, sous-totaux, valeurs en colonnes ou en lignes, décimales fixes, heatmap |
| 8 formats d’export | Excel, Excel + données source, PDF, PNG, Markdown, CSV, HTML, JSON |
| 3 façons de copier | Cellules de tableur, tableau Markdown, image |
| N’importe quelle source | Sélections de grille, requêtes, tables (avec les filtres de l’onglet), jusqu’à 100000 lignes |
| Bien intégré | Suit le thème clair ou sombre, enregistre la mise en page de chaque onglet, tourne en local sans aucun appel réseau |
Construire un tableau croisé
Chaque colonne des données apparaît dans la liste Champs. Glisse un champ dans une zone, ou clique dessus et choisis sa destination :
- Lignes et Colonnes regroupent les données. Empile plusieurs champs pour imbriquer des groupes, et fais glisser les puces pour les réordonner. Inverser échange lignes et colonnes.
- Valeurs sont les nombres dans les cellules. Un même champ peut être ajouté plusieurs fois, par exemple pour afficher sa somme et sa moyenne côte à côte. Sans valeur, le tableau compte les lignes.
- Filtres restreignent les données sans ajouter de ligne ni de colonne.
Fais glisser une puce vers la liste des champs pour la retirer. Clique sur une puce pour voir ses options.
Un nouveau tableau croisé démarre avec une mise en page suggérée :
- Lignes : une colonne de type catégorie, comme
status,planoucountry. - Colonnes : la date principale, regroupée par jour, mois, trimestre ou année selon l’étendue des données. Elle va dans Lignes s’il n’y a pas de colonne de catégorie.
- Valeurs : la somme d’une colonne de type montant, comme
total,amountouquantity, ou un nombre de lignes à défaut.
Les identifiants, les colonnes presque vides, le texte libre et les horodatages comme updated_at ne sont pas utilisés. Réinitialiser la mise en page dans Options revient à la suggestion.
Résumer les valeurs
Clique sur une puce de valeur pour changer ce qu’elle affiche :
| Résumer par | S’applique à |
|---|---|
| Nombre, nombre distinct | N’importe quelle colonne, ou les lignes si aucun champ n’est choisi |
| Somme, moyenne, médiane, écart type, variance | Nombres, y compris le texte numérique |
| Minimum, maximum | Nombres, dates et texte |
| Premier, dernier | N’importe quelle colonne |
Afficher en transforme une valeur en pourcentage du total général, du total de sa ligne ou de sa colonne.
Regroupement, filtrage et tri
Clique sur une puce de ligne, de colonne ou de filtre pour :
- Regrouper les dates par année, trimestre, mois, semaine ISO, jour, heure, mois de l’année ou jour de la semaine. Les dates sont regroupées telles qu’écrites dans la base de données, les fuseaux horaires ne les décalent donc pas.
- Afficher les valeurs : une liste à cocher de chaque valeur avec son nombre de lignes, une zone de recherche, Tout / Aucun, et « seulement » pour ne garder qu’une valeur. Les puces filtrées sont mises en évidence.
- Trier les libellés A→Z ou Z→A (les nombres sont triés numériquement, les nulls en dernier), ou selon la taille de la première valeur, du plus grand au plus petit ou l’inverse.
Options de mise en page
Dans Options de la barre latérale :
- Colonne de totaux et ligne de totaux pour les totaux généraux, et sous-totaux pour chaque groupe quand les lignes ou colonnes sont imbriquées.
- Valeurs en colonnes ou en lignes, pour les tableaux à plusieurs valeurs.
- Décimales : auto (les entiers restent entiers, les autres valeurs ont 2 décimales, les pourcentages 1) ou un nombre fixe de 0 à 4.
- Heatmap colore chaque valeur de la plus petite à la plus grande.
Le titre en haut nomme l’onglet et apparaît dans les exports.
Export et partage
Exporter enregistre un fichier. Les exports contiennent toujours le tableau entier, même si la grille à l’écran n’affiche que les premières lignes d’un très grand tableau.
| Format | Ce que tu obtiens |
|---|---|
| Excel | En-têtes fusionnés, formats numériques et pourcentages, totaux en gras, lignes d’en-tête et colonnes de libellés figées |
| Excel + données source | Le même classeur avec une seconde feuille contenant les lignes chargées, prêtes à être recroisées dans Excel |
| En paysage si le tableau est large. Réduit pour tenir quand c’est possible et découpe les tableaux très larges en pages qui répètent les libellés de ligne | |
| Image | Un PNG net avec le titre, la source et les filtres, prêt pour des slides, des docs ou un chat |
| Markdown | Un tableau façon GitHub pour les README, issues et wikis |
| CSV | Une ligne d’en-tête et des nombres bruts, avec les libellés répétés sur chaque ligne |
| HTML | Une page autonome stylée qui conserve les en-têtes fusionnés |
| JSON | Un objet par ligne, indexé par en-tête de colonne |
Copier place le tableau dans le presse-papiers sous forme de cellules de tableur (à coller dans Excel ou Google Sheets, pourcentages compris), de tableau Markdown ou d’image.
Voici le PNG produit par l’export Image pour le tableau de la démo :

Ouvrir un tableau croisé
| Où | Entrée de menu | Données utilisées |
|---|---|---|
Menu déroulant Nouvel onglet (à côté de +), menu Outils |
Pivot Table | Une requête ou une table choisie dans le plugin |
| Résultats de requête ou données de table : clic droit sur une cellule ou sur le coin supérieur gauche | Pivot Table from Selection | Les cellules sélectionnées |
| En-tête de l’onglet de requête ou menu contextuel de l’éditeur de requêtes | Pivot Query Results | La requête, relancée avec une limite de lignes |
| Table dans la barre latérale, ou en-tête d’un onglet de table | Open in Pivot Table | La table, avec les filtres de l’onglet en clause WHERE |
Pour croiser tout un jeu de résultats depuis la grille, sélectionne d’abord toutes les cellules (clique sur le coin supérieur gauche de la grille ou appuie sur Ctrl/Cmd+A), puis fais un clic droit.
La source de données peut être changée à tout moment avec le bouton crayon de la barre latérale, qui accepte une requête SQL ou une table avec une clause WHERE facultative. SQL dans la barre d’état affiche la requête exacte qui a chargé les données.
Limites de lignes
Les tableaux croisés sont calculés dans le plugin, donc les données sont chargées avec une limite de lignes : 10000 par défaut, configurable jusqu’à 100000 (ton choix est mémorisé).
- Les requêtes sont encapsulées en
SELECT * FROM (<query>) AS pivot_source LIMIT n(TOPsur SQL Server,ROWNUMsur Oracle,FIRSTsur Firebird), c’est donc la base de données qui applique la limite. - Si la base de données rejette la requête encapsulée (par exemple une CTE sur SQL Server), on te propose d’exécuter la requête telle quelle et de garder les premières lignes. Les instructions susceptibles de modifier des données ne sont jamais relancées sans confirmation.
- Les bases de données sans sous-requêtes SQL (MongoDB, Redis, Cassandra et similaires) exécutent la requête telle quelle et gardent les premières lignes.
- Une bannière s’affiche quand la limite est atteinte. Les totaux ne couvrent que les lignes chargées.
- Quand un onglet enregistré est rouvert, les sources de type requête attendent un clic sur Exécuter la requête au lieu de s’exécuter automatiquement. Les sélections et les tables se chargent immédiatement.
Thèmes clair et sombre
Le plugin utilise les couleurs du thème de Beekeeper Studio et change en même temps que l’app.
| Clair | Sombre |
|---|---|
![]() |
![]() |
Installation
Une fois publié, installe Pivot Tables depuis Outils → Gérer les plugins dans Beekeeper Studio (5.5 ou plus récent).
Pour installer un build manuellement, télécharge bk-plugin-pivot-tables-<version>.zip depuis les releases et extrais-le dans le dossier des plugins de Beekeeper Studio :
- Linux :
~/.config/beekeeper-studio/plugins/bk-plugin-pivot-tables - macOS :
~/Library/Application Support/beekeeper-studio/plugins/bk-plugin-pivot-tables - Windows :
%APPDATA%\beekeeper-studio\plugins\bk-plugin-pivot-tables
Développement
yarn install
yarn dev # links the project into Beekeeper's plugins directory and serves it with hot reload
yarn harness # runs the plugin in a browser against a fake Beekeeper Studio
yarn test:run # unit tests (Vitest)
yarn typecheck
yarn build # production build into dist/
yarn package # release zip in release/ (after yarn build)
yarn dev utilise @beekeeperstudio/vite-plugin, qui crée un lien symbolique du projet dans le dossier des plugins. Active les plugins dans Beekeeper Studio, puis ouvre un tableau croisé depuis l’un des menus ci-dessus.
yarn harness sert dev/host.html sur http://localhost:5199/dev/host.html. Il héberge le plugin dans une iframe et répond à ses requêtes API depuis une base SQLite en mémoire contenant 5000 commandes d’exemple, pour travailler sur l’UI et les exports sans Beekeeper Studio. Paramètres de requête :
command=new-pivot|pivot-selection|pivot-query|pivot-tablechoisit l’entrée de menu à émuler.theme=light|darkdéfinit le thème.fresh=1efface l’état enregistré de l’onglet.prod=1charge le build de production depuisdist/(lance d’abordyarn build).
docs/demo.gif est enregistré depuis le harness par scripts/record-demo.cjs, pour pouvoir le refaire après des changements d’UI. Avec yarn harness lancé :
npm install -g playwright && npx playwright install chromium # once; also needs ffmpeg
NODE_PATH="$(npm root -g)" node scripts/record-demo.cjs
Structure du projet
manifest.json Plugin manifest: one view, menu entries for each way of opening it
src/App.vue Startup, data loading, state persistence, export actions
src/components/ Field list, drop zones, menus, pivot table renderer, source editor
src/lib/pivot/ Pivot engine, aggregators, date grouping, grid layout (headers and spans)
src/lib/source/ Loading data: selections, queries and tables with dialect-aware row limits
src/lib/export/ Excel, PDF, image, Markdown, CSV, HTML and JSON exporters
tests/ Vitest specs
dev/ Browser harness that emulates Beekeeper Studio
Le moteur de croisement produit une grille de cellules avec des fusions de lignes et de colonnes (src/lib/pivot/grid.ts). Le tableau à l’écran et chaque exporteur partent de cette grille, ils affichent donc tous la même mise en page.
Publication
- Lance
bin/make-release.sh. Il propose la version suivante à partir des tags existants, définitversiondansmanifest.jsonetpackage.json, commite, puis pousse un tag correspondant commev1.0.0. - Le workflow de release teste, build et crée une release GitHub en brouillon avec
manifest.jsonetbk-plugin-pivot-tables-<version>.zip. Vérifie-la et publie-la. - Pour apparaître dans le gestionnaire de plugins, ajoute une entrée à
plugins.jsondans beekeeper-studio-plugins.
Limitations
- Les filtres des onglets de table sont transmis aux plugins par les builds de Beekeeper Studio qui incluent le changement de filtres
serializeTab. Les versions plus anciennes ouvrent la table entière (avec la limite de lignes) ; tu peux toujours saisir une clauseWHEREdans l’éditeur de source. - La grille affiche les 500 premières lignes et 300 premières colonnes des très grands tableaux (« Afficher plus » charge davantage de lignes). Les exports incluent toujours tout.
- Les images incluent les 2000 premières lignes.
- Les exports PDF ne peuvent pas afficher les caractères CJK, non couverts par la police DejaVu intégrée.
Licence
GPL-3.0. Intègre les polices DejaVu (licence Bitstream Vera) pour les exports PDF.

