J'essaie de trouver une méthode pour retourner un ensemble d'enregistrements avec un nombre dynamique de colonnes. Je peux écrire une requête qui produira la liste des noms de colonnes que j'ai besoin en tant que tel:Requête PostgreSQL avec nombre dynamique de colonnes
SELECT DISTINCT name FROM tests WHERE group = 'basic';
Ceci renvoie une courte liste comme « piquez », « prod », « frappé », « drop », etc. Ensuite, je veux une table produite montrant une série de tests où chacun de ces tests ont été exécutés. Chaque matin, nous regardons ce que les développeurs ont fait et poussez et aiguillons afin que chaque test soit effectué pour chaque jour. Cette requête, je peux écrire statiquement:
SELECT (SELECT success FROM test_results AS i
WHERE i.name = 'poke'
AND i.date = o.date) AS 'poke',
(SELECT success FROM test_results AS i
WHERE i.name = 'prod'
AND i.date = o.date) AS 'prod',
...
FROM test_results AS o GROUP BY date
HAVING date > now() - '1 week'::interval;
Cependant, ceci est codé en dur pour les tests que nous courons chaque jour. Si nous devons maintenant commencer à envoyer l'appareil chaque jour, nous devons mettre à jour la requête. Si nous décidons que le test de chute n'est plus nécessaire, après une semaine, la colonne de test de chute doit déposer le rapport car il ne se produit plus dans les résultats. Renvoyer la valeur NULL pour les tests manquants lorsque seules certaines dates ont une entrée de résultat est parfaitement acceptable.
Existe-t-il une méthode pour créer une liste dynamique de colonnes à partir des résultats en utilisant simplement du SQL normal dans une requête?
Je tentais de générer les données dont j'avais besoin en partie en utilisant une requête WITH
, mais je n'arrive pas à trouver un moyen de construire correctement la dernière ligne à partir d'informations dynamiques.
Edit: est ici quelques exemples de données des deux derniers jours:
CREATE TABLE test_results (
name TEXT NOT NULL,
date DATE default now() NOT NULL,
success BOOLEAN NOT NULL
);
INSERT INTO test_results (name, date, success) VALUES ('hit', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-20', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-21', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-21', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-22', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-22', FALSE);
INSERT INTO test_results (name, date, success) VALUES ('poke', '2017-06-23', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('prod', '2017-06-23', TRUE);
INSERT INTO test_results (name, date, success) VALUES ('drop', '2017-06-23', TRUE);
Si je lance ma requête sur la plage de données de 21/06/2017 à 23/06/2017, je comme pour obtenir des résultats comme celui-ci comprenant une matrice de tous les tests qui ont été exécuté en ce moment:
date | poke | prod | drop
------------+--------+--------+-----
2017-06-21 | TRUE | TRUE | NULL
2017-06-22 | TRUE | FALSE | NULL
2017-06-23 | TRUE | TRUE | TRUE
les noms Poke, prod, déposer tous les noms ont été trouvés dans le champ nom d'une ligne au cours de cette période . NULL est renvoyé pour la requête détaillée pour tous les tests qui n'ont pas d'enregistrement pour cette date.
Modifier votre question et de fournir des exemples de données et les résultats souhaités. –
Vous devez construire votre instruction dynamiquement dans une procédure, puis l'exécuter. J'ai fait des choses comme ça dans le passé, mais il faudrait que je consulte mon disque. Si personne ne vous donne la bonne réponse, je la regarderai demain. –