Получить данные из более чем двух таблиц - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть пять таблиц.

Employee(Fname,Lname,Empno(Primary),Bdate,Address,Salary,Dnumber(Foreign))
Department(Dname, Dnumber(Primary),Mgrno)
Location(Dnumber(Foreign),Dlocation)
Timesheet(Empno(foreign),Pnumber(Foreign),Hours_per_day)
Project(Pname,Pnumber(Primary),Location,Dnumber(Foreign))

Как я могу получить:

а. Для местоположения проекта 'ljk' укажите номер проекта, контролирующий отдел и руководителя отдела Fname, Lname и Address.

б. Найдите общую зарплату всех сотрудников в отделе «F», а также максимальную, минимальную и среднюю заработную плату в этом отделе.

с. Для каждого отдела найдите номер отдела (Dnumber), количество сотрудников и среднюю зарплату в отделе.

За проблему c. Я могу получить данные только об отделе, количестве отделов и количестве сотрудников. Я не уверен, как добавить столбец средней заработной платы в таблицу результатов.

Для двух других частей. Я думаю, что потребуется объединение более 2-х таблиц. Но я не уверен, возможно ли это.

образец: Сотрудник:

+-------+----------+-------+------------+---------+--------+---------+
| Fname | Lname    | Empno | Bdate      | Address | Salary | Dnumber |
+-------+----------+-------+------------+---------+--------+---------+
| g     | a        |   755 | 1986-09-09 | how     |   6598 |     100 |
| d     | v        |   796 | 1969-12-03 | e       |      2 |     101 |
| r     | n        |   850 | 1979-12-01 | a       |     10 |     100 |
| n     | h        |   879 | 1979-12-02 | b       |      8 |     101 |
| k     | k        |   888 | 1979-12-03 | c       |      6 |     102 |
+-------+----------+-------+------------+---------+--------+---------+

Отдел:

+-----------+---------+-------+
| Dname     | Dnumber | Mgrno |
+-----------+---------+-------+
| F         |     100 |   850 |
| ll        |     101 |   879 |
| M         |     102 |   888 |
+-----------+---------+-------+

Проект:

+----------+---------+----------+---------+
| Pname    | Pnumber | Location | Dnumber |
+----------+---------+----------+---------+
| a        |      79 | ljk      |     101 |
| a        |      89 | ljk      |     100 |
| mardf    |      90 | kjk      |     102 |
+----------+---------+----------+---------+

Timesheet:

+-------+---------+---------------+
| Empno | Pnumber | Hours_per_day |
+-------+---------+---------------+
|   850 |      89 |             6 |
|   888 |      90 |             6 |
|   879 |      79 |             9 |
+-------+---------+---------------+

Расположение:

+---------+-----------+
| Dnumber | Dlocation |
+---------+-----------+
|     100 | east      |
|     101 | west      |
|     102 | north     |
+---------+-----------+

Что я пробовал:

Я пробовал это для части (с)

SELECT Department.Dname, 
    Department.Dnumber, 
    COUNT(*) AS 'TOTAL EMPLOYEES' 
FROM Department 
INNER JOIN Employee 
    ON Department.Dnumber = Employee.Dnumber 
GROUP BY Department.Dnumber;

Я не уверен, как добавить сюда столбец средней зарплаты.

http://sqlfiddle.com/#!9/a512f1

CREATE TABLE Department(
    Dname varchar(10),
    Dnumber int(5),
    Mgrno int(5),
    PRIMARY KEY(Dnumber)
);

CREATE TABLE Employee(
    Fname varchar(20),
    Lname varchar(20),
    Empno int(5),
    Bdate date,
    Address varchar(10),
    Salary float(5),
    Dnumber int(5),
    PRIMARY KEY(Empno),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
);


CREATE TABLE Location(
    Dnumber int(5),
    Dlocation varchar(10),
    PRIMARY KEY(Dlocation),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
);

CREATE TABLE Project(
    Pname varchar(10),
    Pnumber int(5),
    Location varchar(10),
    Dnumber int(5),
    PRIMARY KEY(Pnumber),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
);

CREATE TABLE Timesheet(
    Empno int(5),
    Pnumber int(5),
    Hours_per_day int(5),
    FOREIGN KEY(Empno) REFERENCES Employee(Empno),
    FOREIGN KEY(Pnumber) REFERENCES Project(Pnumber)
);

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Попробуйте эти запросы для всех ваших конкретных проблем.

А вот и SQL-скрипка: http://sqlfiddle.com/#!9/e4ad1a/2/2

Для задачи а:

SELECT P.Pnumber as 'Project Number', 
D.Dname as Department,
E.Fname as 'Manager\'s Fname',
E.Lname as 'Manager\'s Lname',
E.Address as 'Manager\'s Address'
FROM Project P 
INNER JOIN Department D ON P.Dnumber = D.Dnumber
INNER JOIN Employee E ON P.Dnumber = E.Dnumber
WHERE P.Location = 'ljk';

Выход:

| Project Number | Department | Manager's Fname | Manager's Lname | Manager's Address |
|----------------|------------|-----------------|-----------------|-------------------|
|             79 |         ll |               d |               v |                 e |
|             79 |         ll |               n |               h |                 b |
|             89 |          F |               g |               a |               how |
|             89 |          F |               r |               n |                 a |

Для задачи b:

SELECT SUM(Salary) as 'Total Salary',
MAX(Salary) as 'Maximum Salary',
MIN(Salary) as 'Minimum Salary',
AVG(Salary) as 'Average Salary'
FROM Employee E
INNER JOIN Department D ON E.Dnumber = D.Dnumber
WHERE D.Dname = 'F';

Выход:

| Total Salary | Maximum Salary | Minimum Salary | Average Salary |
|--------------|----------------|----------------|----------------|
|         6608 |           6598 |             10 |           3304 |

Для задачи c:

SELECT D.Dname as 'Department Name',
D.Dnumber as 'Department Number',
COUNT(DISTINCT E.Empno) as 'No. of Employees',
AVG(E.salary) as 'Average Salary'
FROM Department D
INNER JOIN Employee E ON D.Dnumber = E.Dnumber
GROUP BY D.Dnumber;

выход

| Department Name | Department Number | No. of Employees | Average Salary |
|-----------------|-------------------|------------------|----------------|
|               F |               100 |                2 |           3304 |
|              ll |               101 |                2 |              5 |
|               M |               102 |                1 |              6 |
0 голосов
/ 29 апреля 2018

Это должно привести вас к проблеме C :

SQL Fiddle

Настройка схемы MySQL 5.6 :

CREATE TABLE Department(
    Dname varchar(10),
    Dnumber int(5),
    Mgrno int(5),
    PRIMARY KEY(Dnumber)
    );

CREATE TABLE Employee(
    Fname varchar(20),
    Lname varchar(20),
    Empno int(5),
    Bdate date,
    Address varchar(10),
    Salary float(5),
    Dnumber int(5),
    PRIMARY KEY(Empno),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
    );


CREATE TABLE Location(
    Dnumber int(5),
    Dlocation varchar(10),
    PRIMARY KEY(Dlocation),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
    );

CREATE TABLE Project(
    Pname varchar(10),
    Pnumber int(5),
    Location varchar(10),
    Dnumber int(5),
    PRIMARY KEY(Pnumber),
    FOREIGN KEY(Dnumber) REFERENCES Department(Dnumber)
    );

CREATE TABLE Timesheet(
    Empno int(5),
    Pnumber int(5),
    Hours_per_day int(5),
    FOREIGN KEY(Empno) REFERENCES Employee(Empno),
    FOREIGN KEY(Pnumber) REFERENCES Project(Pnumber)
    );

INSERT INTO `Department`
(`Dname`,`Dnumber`,`Mgrno`)
VALUES
('Dept1','100','850'),
('Dept2','101','879'),
('Dept3','102','888');

INSERT INTO `Project`
(`Pname`,`Pnumber`,`Location`,`Dnumber`)
VALUES
('adfdd','79','ljk','101'),
('ffff','89','jkj','100'),
('mardf','90','kjk','102');

INSERT INTO `Employee`
(`Fname`,`Lname`,`Empno`,`Bdate`,`Address`,`Salary`,`Dnumber`)
VALUES
('g','a','755','1986-09-09','how','6598','100'),
('d','v','796','1969-12-03','e','2','101'),
('r','n','850','1979-12-01','a','10','100'),
('n','h','879','1979-12-02','b','8','101'),
('k','k','888','1979-12-03','c','6','102');

Запрос 1 :

SELECT 
  a.`Dname`, 
  a.`Dnumber`, 
  COUNT(DISTINCT b.`Empno`) AS `TOTAL EMPLOYEES`,
  AVG(b.`Salary`) as `Average Salary`,
  MIN(b.`Salary`) as `Minimum Salary`,
  MAX(b.`Salary`) as `Maximum Salary`
FROM `Department` a
LEFT JOIN `Employee` b
  ON a.`Dnumber` = b.`Dnumber`
GROUP BY a.Dnumber

Результаты :

| Dname | Dnumber | TOTAL EMPLOYEES | Average Salary | Minimum Salary | Maximum Salary |
|-------|---------|-----------------|----------------|----------------|----------------|
| Dept1 |     100 |               2 |           3304 |             10 |           6598 |
| Dept2 |     101 |               2 |              5 |              2 |              8 |
| Dept3 |     102 |               1 |              6 |              6 |              6 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...