2009-11-24 4 views
3

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?

+0

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

+2

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 . –

+0

Ah, c'est vrai! Seuls les alias de table sont accessibles dans la clause WHERE. – keithjgrant

Répondre

4

Utilisation:

SELECT x.company_id, 
     x.non_billable, 
     x.billable, 
     x.non_billable/x.billable AS RATIO 
    FROM (SELECT t.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 
     FROM TRANSACTIONS 
    GROUP BY t.company_id) x