Je sais que cette syntaxe réelle est fausse, mais elle vous aidera à comprendre ce que je veux. J'en ai besoin dans ce format, car il fait partie d'une requête beaucoup plus grande.
select count(*) as tot_proj,
"location" ,
sum(fte_count::float) as ft
from insights_view iv2
where project_status = 'Live' and fte_count != 'NULL'
group by "location"
je veux tout cela en une seule requête ... j'ai essayé celle-ci
select location,
count(*) as tot_proj where project_status='live',
sum(fte_count) as tot_emp where project_status='live' and fte_count != 'NULL'
from table_name
group by location
mais mon compte tot_proj ne correspond pas ...
3 Réponses :
Je pense que vous voulez la syntaxe suivante:
select location,
sum(project_status = 'live') as tot_proj ,
sum(case when project_status = 'live' then fte_count end) as tot_emp
from table_name
group by location
Ceci utilise la clause standard filter pour agréger les fonctions, que Postgres prend en charge. Vous n'avez pas besoin de vérifier si fte_count est null , car sum () ignore les valeurs null (et si vous deviez, vous auriez besoin de n'est pas nul plutôt que de ! = 'NULL' ).
D'un autre côté, si vous utilisez MySQL et pas Postgres:
select location,
count(*) filter(where project_status = 'live') as tot_proj ,
sum(fte_count) filter(where project_status = 'live') as tot_emp
from table_name
group by location
J'ai essayé le 2ème mais j'obtiens la somme de la fonction d'erreur (booléenne) n'existe pas @GMB
@gudi: quelle base de données utilisez-vous, Postgres ou MySQL?
m en utilisant mysql @GMB
@gudi: vous n'obtiendrez pas cette erreur dans MySQL ... Êtes-vous capable de configurer un DB Fiddle d'une sorte (comme ici )?
select location,
sum(project_status='live') as tot_proj,
sum(case when project_status='live' then fte_count end) as tot_emp
from table_name
group by location
Je déplacerais la comparaison 'live' vers une clause where . Ensuite, si vous voulez vraiment dire NULL et non 'NULL' , vous pouvez simplement additionner les valeurs. Donc:
select location, count(*) as tot_proj , sum(fte_count) as tot_emp from table_name where project_status = 'live' group by location;
Notez que 'NULL' est une chaîne. Cela n'a pas de sens d'utiliser sum () sur une chaîne, donc je suppose que vous voulez vraiment dire NULL le mot-clé SQL. Si tel est le cas, cette valeur est ignorée par sum () et la plupart des autres fonctions d'agrégation.
De plus, ce qui précède va filtrer tous les emplacements qui ont pas de projets "live". Parce que vous proposez une version avec un filtre où , je suppose que ce n'est pas un problème.
Utilisez-vous MySQL ou Postgresql?
@gudi. . . J'ai supprimé les balises de base de données incohérentes. Veuillez indiquer la base de données que vous utilisez réellement.
m en utilisant postgresql