2016-02-23 2 views
0

У меня это таблицы:SQL вычисления процент от суммы

enter image description here

Теперь я хочу, чтобы получить процент часов, затрачиваемое на проекты, которые сотрудники «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'; 

Ошибка говорит о том, что это не групповая групповая функция.

Что мне делать?

Благодаря, Джулиан

ответ

0

Вы хотите получить процент часов, потраченных на проекты, над которыми работали сотрудники «XYZ GmbH» (что означает для каждого сотрудника, а не для всех сотрудников вместе), вот один из способов сделать это, есть 2 шага к это:

  1. Получить общее количество часов для «а ..» проект: в этой части вы дали запрос в качестве суммы (все значения), которые я считаю, это не так, как мы должны взять на себя общее количество часов для весь проект, характерный для «xyz», и получить процент, вычислив часы для «людей», которые работали на него. Однако, если мое предположение неверно, пожалуйста, измените первый запрос ниже, чтобы получить общую сумму, отдых должен быть прекрасным.
  2. Получить общее количество часов для каждого сотрудника и прибыть на процент

Смотрите ниже запроса:

--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 
+0

Ничего себе! Спасибо за ответ. Помогли! – Stjubit

0
SELECT AA.FSUM/BB.TSUM FROM 
(
    SELECT SUM(mp.STDANZ) AS FSUM 
    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 , 
(
    SELECT SUM(STDANZ) AS TSUM FROM MITPRO 
)BB 

Здесь АА и ВВ являются промежуточными временными таблицами, которые содержат единственную строку суммы каждую. Мы делаем CROSS JOIN на этих двух таблицах с одной строкой, которые по существу дают одну строку.

+0

Объяснение ответа позволит значительно повысить его качество/lisibility – Sidewinder94

+0

Эй, спасибо за ваш ответ , но я не думаю, что мой учитель хочет увидеть этот ответ. Это единственный способ сделать это? Почему мой запрос выше не работает? – Stjubit

+0

Спасибо Sidewinder за ваше предложение. Это был мой первый ответ на переполнение стека. Я обязательно добавлю объяснения в будущие ответы. – Praveen

Смежные вопросы