SQL计算总和的百分比

SQL计算总和的百分比,sql,sum,percentage,Sql,Sum,Percentage,我有这张桌子: 现在我想得到“XYZ GmbH”员工在项目上花费的时间百分比 因此,我需要通过以下方式获得完整的工作时间: SELECT SUM(STDANZ) FROM MITPRO; …以及XYZ GmbH在其项目上花费的时间: SELECT SUM(mp.STDANZ) FROM PROJEKT p INNER JOIN MITPRO mp ON (p.PNR = mp.PNR) INNER JOIN FIRMA f ON (f.FNR = p.

我有这张桌子:

现在我想得到“XYZ GmbH”员工在项目上花费的时间百分比

因此,我需要通过以下方式获得完整的工作时间:

SELECT SUM(STDANZ)
  FROM MITPRO;
…以及XYZ GmbH在其项目上花费的时间:

SELECT SUM(mp.STDANZ)
  FROM PROJEKT p INNER JOIN MITPRO mp ON (p.PNR = mp.PNR)
                 INNER JOIN FIRMA f ON (f.FNR = p.FNR)
 WHERE f.FNAME='XYZ GmbH';
那么公式将是:

 SUM(STDANZ_of_XYZ) / SUM(TOTAL) * 100
我试过了,但总是出错:

SELECT SUM(mp.STDANZ) / (SELECT SUM(STDANZ) FROM MITPRO)
  FROM PROJEKT p INNER JOIN MITPRO mp ON (p.PNR = mp.PNR)
                 INNER JOIN FIRMA f ON (f.FNR = p.FNR)
 WHERE f.FNAME='XYZ GmbH';
错误表明它不是单个组函数

我该怎么办

谢谢, 朱利安

从中选择AA.FSUM/BB.TSUM 选择summap.STDANZ作为FSUM 从p.PNR=mp.PNR上的项目p内部连接MITPRO mp f.FNR=p.FNR上的内连接固件f 其中f.FNAME='XYZ GmbH' AA,, 从MITPRO中选择SUMSTDANZ作为TSUM BB
这里AA和BB是中间临时表,每个表都包含一行和。我们在这两个单行表上进行交叉联接,这实际上是一个单行。

您想得到“XYZ GmbH”的员工在项目上花费的小时百分比,这意味着每个员工的时间百分比,而不是所有员工的时间百分比,这是一种方法,有两个步骤:

获取“xyz..”项目的总小时数:对于这一部分,您将查询作为sumall值,我认为这是不对的,因为我们必须获取整个项目特定于“xyz”的总小时数,并通过计算为其工作的“人员”的小时数得出百分比。但是,如果我的假设不正确,请更改下面的第一个查询以获得总数,其余的就可以了。 获取每个员工的总小时数并得出百分比 请参见以下查询:

--1. Identify the total hours for the project itself (so as to arrive at the percentage); from your question, 
-- we need to consider only xyz gmbh project
DECLARE @TOTAL_SUM INT

SET @TOTAL_SUM = 
(SELECT
    SUM(MI.STDANZ) TOTAL_SUM 
FROM
    FIRMA F
    INNER JOIN PROJEKT P
    ON F.FNR = P.FNR
    INNER JOIN MITPRO MI
    ON MI.PNR = P.PNR
    --INNER JOIN MITARBEITER M
    --ON M.MNR = MI.MNR
WHERE
    F.FNAME = 'XYZ GmbH')t


--2. Identify the total hours for each employee for the xyz gmbh project
SELECT
    M.MNR   -- Employee id
    ,M.MName -- Employee name
    ,SUM(MI.STDANZ) TOTAL_SUM -- Total hours
    , (SUM(MI.STDANZ) / @TOTAL_SUM)*100 AS PERCENTAGE --Percentage of hours
FROM
    FIRMA F
    INNER JOIN PROJEKT P
    ON F.FNR = P.FNR
    INNER JOIN MITPRO MI
    ON MI.PNR = P.PNR
    INNER JOIN MITARBEITER M
    ON M.MNR = MI.MNR
WHERE
    F.FNAME = 'XYZ GmbH'
GROUP BY
    M.MNR
    ,M.MNAME

对答案的解释将大大提高它的质量/易读性。谢谢你的回答,但我认为我的老师不想看到这个答案。这是唯一的办法吗?为什么我上面的问题不起作用?谢谢响尾蛇的建议。这是我关于堆栈溢出的第一个答案。我一定会在以后的回答中添加解释。哇!谢谢你的回答。帮了很多忙!