Alex Man
Alex Man

Reputation: 4886

Calculating Total of the row and finding average using MySQL

I have two tables App and Store

My query is as given below

SELECT 
AppName, 
SUM( CASE HasGroup  WHEN 1 THEN 1 ELSE 0 END ) AS Grouped,
SUM( CASE HasGroup WHEN 0 THEN 1 ELSE 0 END ) AS NonGrouped,
ROUND(((SUM( CASE HasGroup  WHEN 1 THEN 1 ELSE 0 END ) / 
    (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
        SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) AS GroupedPercentage,
ROUND(((SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) / 
    (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
        SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) AS NonGroupedPercentage
FROM
    Apps
    INNER JOIN Store
        ON (Apps.Store = Store.Store) 
        AND AppName !='' GROUP BY AppName 

I am able to find the columns except AverageNonGrouped (%) since I don't know how to get total NonGrouped(%), Can anyone please help me on this

Upvotes: 2

Views: 51

Answers (1)

Dan Ionescu
Dan Ionescu

Reputation: 3423

It's big query, but it does the job (i've tested on a dataset localy)

SELECT 
    AppName, 
    SUM( CASE HasGroup  WHEN 1 THEN 1 ELSE 0 END ) AS Grouped,
    SUM( CASE HasGroup WHEN 0 THEN 1 ELSE 0 END ) AS NonGrouped,
    ROUND(((SUM( CASE HasGroup  WHEN 1 THEN 1 ELSE 0 END ) / 
    (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
        SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) AS GroupedPercentage,
    ROUND(((SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) / 
    (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
        SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) AS NonGroupedPercentage,

    ROUND(((SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) / 
    (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
        SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) / 

    (SELECT SUM(NonGroupedPercentage)
    FROM (
    SELECT 
        ROUND(((SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) / 
            (SUM( CASE HasGroup  WHEN 0 THEN 1 ELSE 0 END ) + 
                SUM( CASE HasGroup WHEN 1 THEN 1 ELSE 0 END )))*100), 2) AS NonGroupedPercentage
    FROM
        apps
    INNER JOIN store
            ON (apps.Store = store.Store) 
            AND AppName !='' 
    GROUP BY AppName 
    ) AS total) *100  AS AverageNonGroupedPercentage
FROM
    apps
INNER JOIN store
    ON (apps.Store = store.Store) 
    AND AppName !='' 
GROUP BY AppName 

Upvotes: 1

Related Questions