Je veux créer un tableau croisé dynamique montrant le mois sur le mois la somme des réservations pour chaque travel_mode
.PostgreSQL crosstab() alternative avec CASE et les agrégats
Tableau bookings
:
timestamp
, bookings
, provider_id
Tableau providers
:
provider_id
, travel_mode
fonction Tableau croisé dynamique et les fonctions de tableau croisé ne doivent pas être utilisés pour le faire. Donc j'essaie d'utiliser JOIN et CASE. Voici la requête:
SELECT b.month,
(CASE WHEN p.travel_mode=train then b.amount end)train,
(CASE WHEN p.travel_mode=bus then b.amount end)bus,
(CASE WHEN p.travel_mode=air then b.amount end)air
FROM
(SELECT to_char(date_,month) as month, travel_mode, sum(bookings) as amount
from bookings as b
join providers as p
on b.provider_id=p.provider_id
group by b.month, p.travel_mode)
group by b.month;
Cependant, je reçois une erreur qui dit:
subquery in FROM must have an alias LINE 6:
Et quand j'ajoute un alias, il renvoie une erreur en disant:
column p.travel_mode must appear in the GROUP BY clause or be used in an aggregate function LINE 2:
Le résultat final devrait être quelque chose comme ça
Month Air Bus Train
01 Amount(air) Amount(Bus) Amount(train)
J'ai l'impression que c'est une erreur mineure quelque part, mais je suis incapable de comprendre du tout.
P.S. J'ai dû supprimer toutes les citations dans la question car cela ne me permettait pas de publier ceci. Mais ceux-ci sont pris en charge dans la requête réelle.
Vous pouvez (et devriez) publier tous vos devis. Cela le permet certainement. Vous devez toujours ajouter la définition de table réelle (instruction CREATE TABLE) montrant les types de données et les contraintes ainsi que votre version de Postgres. –