gpt4 book ai didi

mysql - MySQL 中 SUM 的 SUM 百分比

转载 作者:行者123 更新时间:2023-11-29 21:51:32 24 4
gpt4 key购买 nike

干杯。

我需要计算所选年份中每个部门的总工资的百分比。

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)
);

最佳答案

有几种方法可以获得指定的结果。

一种方法是使用内联 View 来获取所有部门的总工资。例如,这样的查询:

  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

您可以在另一个查询中引用该查询的结果,方法是用括号括起来并用它代替表名。必须为内联 View 分配一个别名。 (在 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 列表中使用子查询。还有其他可行的方法,但其中一些方法依赖于某些表中的行具有唯一标识符。在演示这些之前,我们需要一些表定义。

关于mysql - MySQL 中 SUM 的 SUM 百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33585549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com