Faisant suite à ma question summarizing-two-conditions-on-the-same-sql-table, j'ai ajouté une colonne de rapport qui est simplement une colonne SUM (...) divisée par une deuxième colonne SUM (...):MySQL Alias de Referencing colonne Aggregate
SELECT
COMPANY_ID,
SUM(CASE WHEN STATUS IN (0, 1) THEN 1 ELSE 0 END) AS NON_BILLABLE,
SUM(CASE WHEN STATUS IN (2, 3) THEN 1 ELSE 0 END) AS BILLABLE
SUM(NON_BILLABLE)/SUM(BILLABLE) AS RATIO
FROM TRANSACTIONS
GROUP BY COMPANY_ID
Il semble agréable et propre à définir le RATIO comme ça, mais aussi apparemment forbidden by SQL.
Pour que la requête fonctionne, j'ai simplement copié les instructions CASE pour NON_BILLABLE et BILLABLE.
SELECT
COMPANY_ID,
SUM(CASE WHEN STATUS IN (0, 1) THEN 1 ELSE 0 END) AS NON_BILLABLE,
SUM(CASE WHEN STATUS IN (2, 3) THEN 1 ELSE 0 END) AS BILLABLE
SUM(CASE WHEN STATUS IN (0, 1) THEN 1 ELSE 0 END)/SUM(CASE WHEN STATUS IN (2, 3) THEN 1 ELSE 0 END) AS RATIO
FROM TRANSACTIONS
GROUP BY COMPANY_ID
Y at-il un meilleur, plus propre (non redondant) façon d'écrire cette requête?
Le problème est que vous ne pouvez pas accéder aux alias ('' NON_BILLABLE' et BILLABLE') dans la clause select de votre requête. Vous ne pouvez les référencer que dans les clauses WHERE ou HAVING. Vous * pourriez * être en mesure de le truquer avec une jointure à gauche ou quelque chose, mais je ne suis pas sûr. – keithjgrant
Selon http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error vous ne pouvez pas y accéder dans les clauses WHERE en SQL standard . –
Ah, c'est vrai! Seuls les alias de table sont accessibles dans la clause WHERE. – keithjgrant