2014-04-04 32 views
1

我有这样的代码它总结了员工的时间,并使用汇总得到的总的时间:与汇总值除以

SELECT IFNULL(users, 'Total') AS Employee, 
SUM(actual) AS Amount 

FROM table1 

WHERE name = "ProjectName" 

GROUP BY users 
WITH ROLLUP 

Employee | Amount 
    A  | 15 
    B  | 10 
    C  | 10 
    Total | 35 

我想为我的第三列做(百分比)是将总和(实际)除以总值得出百分比。 但是对于百分比列,我不需要获得总百分比。

总价值不是恒定的,只是35

Employee | Amount | Percent 
    A  | 15 | 42.85 
    B  | 10 | 28.57 
    C  | 10 | 28.57 
    Total | 35 | 

我怎么能这样做? 这里的sqlfiddle:http://sqlfiddle.com/#!2/4543b/5

回答

4

这个工作过程所需:

SET @project_name = 'ProjectName'; 

SELECT IFNULL(users, 'Total') AS Employee, SUM(actual) AS Amount, 
    IF(ISNULL(users), '', TRUNCATE(SUM(actual)/sum_table.amount_sum * 100, 2) 
    ) AS Percent 
    FROM Table1 
    INNER JOIN (
     SELECT SUM(actual) AS amount_sum 
      FROM Table1 
      WHERE name = @project_name 
    ) AS sum_table 
    WHERE name = @project_name 
    GROUP BY users 
    WITH ROLLUP; 

DEMO @SQL Fiddle

+0

这不是OP想要的输出。 –

+0

@AnishShah - ???你真的测试过我的查询吗?这正是OP描述的!为什么要为此付出代价? – citizen404

+0

检查你的sqlfiddle的输出和问题中的输出。他们不同 –

1

也许是工作最好留给你的应用程序的逻辑层,但是如果你绝对必须在数据层做到这一点,那么你只需要另一种认为总体市场加入您的查询:

SELECT IFNULL(users, 'Total') AS Employee, 
     SUM(actual) AS Amount, 
     SUM(actual)/t.Total AS Percent 
FROM  Table1, (
      SELECT SUM(actual) AS Total 
      FROM Table1 
      WHERE name = 'ProjectName' 
     ) t 
WHERE name = 'ProjectName' 
GROUP BY users WITH ROLLUP 
1
SELECT if(users is NULL,'Total',users) as Employee, sum(actual) as Amount, 
(CASE 
WHEN users is not null THEN CAST(sum(actual)/sum.sumAmt * 100 as DECIMAL(10,2)) 
END) as Percent 

FROM Table1, (SELECT sum(actual) as sumAmt FROM Table1 
       WHERE name = 'ProjectName') sum 

WHERE name = "ProjectName" 

GROUP BY users 
WITH ROLLUP 

DEMO

+0

是否有可能只获取金额列的汇总值? http://sqlfiddle.com/#!2/4543b/6 – hearmeroar

+0

@hearmeroar我已经更新了答案:)希望它可以帮助你 –