2015-11-07 120 views
0

乾杯。MySQL中SUM總數的百分比

我需要計算所有工資總額的絕對值可以得到選定年份的每個部門。

SELECT D.dept_name AS 'Department', SUM(S.salary) AS 'Total', CONCAT(ROUND(SUM(SUM(S.salary)), 2), '%') AS '%' 
FROM departments D INNER JOIN dept_emp DE ON D.dept_no=DE.dept_no INNER JOIN salaries S ON DE.emp_no=S.emp_no 
WHERE (S.from_date<='2000-01-01') AND (S.to_date>='2000-12-31') 
GROUP BY D.dept_name 

我試過,但它不工作;它說: 錯誤代碼1111,SQL狀態HY000:無效的使用組功能

SUM(SUM())聽起來對我很可疑,但我沒有想法。

下面是桌子,如果你需要:

REATE TABLE employees (
    emp_no  INT    NOT NULL, 
    birth_date DATE   NOT NULL, 
    first_name VARCHAR(14)  NOT NULL, 
    last_name VARCHAR(16)  NOT NULL, 
    gender  ENUM ('M','F') NOT NULL,  
    hire_date DATE   NOT NULL, 
    PRIMARY KEY (emp_no) 
); 

CREATE TABLE departments (
    dept_no  CHAR(4)   NOT NULL, 
    dept_name VARCHAR(40)  NOT NULL, 
    PRIMARY KEY (dept_no), 
    UNIQUE KEY (dept_name) 
); 

CREATE TABLE dept_emp (
    emp_no  INT    NOT NULL, 
    dept_no  CHAR(4)   NOT NULL, 
    from_date DATE   NOT NULL, 
    to_date  DATE   NOT NULL, 
    KEY   (emp_no), 
    KEY   (dept_no), 
    FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, 
    FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE, 
    PRIMARY KEY (emp_no,dept_no) 
); 

CREATE TABLE salaries (
    emp_no  INT    NOT NULL, 
    salary  INT    NOT NULL, 
    from_date DATE   NOT NULL, 
    to_date  DATE   NOT NULL, 
    KEY   (emp_no), 
    FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, 
    PRIMARY KEY (emp_no, from_date) 
); 
+0

你是正確可疑。給我們適當的DDL和期望的結果 – Strawberry

回答

0

解決

我已經做了幾個修改爲@ Spencer7593解決方案:

SELECT D.dept_name       AS `Department` 
    , SUM(S.salary)       AS `Total` 
    , MAX(t.tot)       AS `total_all_departments` 
    , ROUND((SUM(S.salary)/MAX(t.tot)))*100 AS `pct` 
    FROM departments D 
    JOIN dept_emp DE ON DE.dept_no = D.dept_no 
    JOIN salaries S ON S.emp_no = DE.emp_no 
CROSS 
    JOIN ( 
     SELECT SUM(ts.salary) AS `tot` 
      FROM departments td 
      JOIN dept_emp te ON td.dept_no = te.dept_no 
      JOIN salaries ts ON te.emp_no=ts.emp_no 
      WHERE ts.from_date <= '2000-01-01' 
      AND ts.to_date >= '2000-12-31' 
     ) t 
WHERE S.from_date <= '2000-01-01' 
    AND S.to_date >= '2000-12-31' 
GROUP BY D.dept_name 
0

有一對夫婦的方法使指定的結果。

一種方法是使用內聯視圖來獲取所有部門的總工資。例如,像這樣的查詢:

SELECT SUM(ts.salary) AS `tot` 
    FROM departments td 
    JOIN dept_emp te ON td.dept_no = te.dept_no 
    JOIN salaries ts ON te.emp_no=ts.emp_no 

您可以從該查詢在另一個查詢通過包裝它括號和包括到位表名參考的結果。內聯視圖必須分配一個別名。 (在MySQL地方話,這被稱爲 「派生表」。)

例如:

SELECT D.dept_name       AS `Department` 
    , SUM(S.salary)       AS `Total` 
    , MAX(t.tot)       AS `total_all_departments` 
    , ROUND(SUM(S.salary)/MAX(t.tot)*100,0) AS `pct` 
    FROM departments D 
    JOIN dept_emp DE ON DE.dept_no = D.dept_no 
    JOIN salaries S ON S.emp_no = DE.emp_no 
CROSS 
    JOIN ( 
     SELECT SUM(ts.salary) AS `tot` 
      FROM departments td 
      JOIN dept_emp te ON td.dept_no = te.dept_no 
      JOIN salaries ts ON te.emp_no=ts.emp_no 
     ) t 
WHERE S.from_date <= '2000-01-01' 
    AND S.to_date >= '2000-12-31' 
GROUP BY D.dept_name 

這並不是唯一的方法。例如,您也可以在SELECT列表中使用子查詢。還有其他方法可以工作,但其中一些方法依賴於某些表中的行具有唯一標識符。在我們演示這些之前,我們需要一些表格定義。

+0

我看到你做了什麼,這是一個很好的方式來計算總數,但出於某種原因,pct總是0>< – Argos

+0

它可能是執行計算的表達式。確保返回總薪水的兩個表達式「爲每個部門」和「爲所有部門」返回正確的值。下一步將添加一個表達式來分割兩個(得到一個分數)。一旦你得到了,修改表達式來獲得舍入和格式。 – spencer7593