Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как посчитать сумму зарплат для отдела?  [new]
Vladlenmakiyato
Member

Откуда:
Сообщений: 18
Есть таблицы

staff
id | fam | dep_id
----------------------
1 | И | 1
2 | П | 2
3 | С | 1
4 | Л | 1
5 | Д | 2
6 | М | 3

departments
id | name
-----------------
1 | Бухгалтерия
2 | ИТ
3 | Продажи

Payments
id | staff_id | summa
-----------------------
1 | 1| 10
2 | 2| 20
3 | 3| 15
4 | 4| 10
5 | 5| 16
6 | 6| 40

Нужно вывести название отдела и общую сумму оплаты за сотрудников этого отдела.

как сделать такой запрос?
6 ноя 14, 19:00    [16808049]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Почитать про join и group by.
6 ноя 14, 19:01    [16808051]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Vladlenmakiyato
Member

Откуда:
Сообщений: 18
Что то типо этого?

SELECT departments.name, SUM(Payments.summa)
from departments
join staff on departments.id = staff.dep_id
join Payments on Payments.staff_id = staff.id
group by departments.name


Но он сумму всех зарплат считает, а мне нужно для конкретного отдела
6 ноя 14, 19:28    [16808125]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
?
... where departaments.id = 2
6 ноя 14, 19:32    [16808129]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
... перед строчкой GROUP BY
6 ноя 14, 19:33    [16808132]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Vladlenmakiyato
Member

Откуда:
Сообщений: 18
SIMPLicity_,

Почему where departaments.id = 2 ?

Мне нужно получить таблицу вида

departments.name | summa
----------------------------------
Бухгалтерия | 35
ИТ | 36
Продажи | 40
6 ноя 14, 19:38    [16808141]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Vladlenmakiyato
Что то типо этого?

SELECT departments.name, SUM(Payments.summa)
from departments
join staff on departments.id = staff.dep_id
join Payments on Payments.staff_id = staff.id
group by departments.name


Но он сумму всех зарплат считает, а мне нужно для конкретного отдела


?!

PS Через час вернусь к компу - попробую понять, что не так в Вашем запросе...
6 ноя 14, 19:51    [16808178]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Vladlenmakiyato
Member

Откуда:
Сообщений: 18
Блин, не то спрашиваю
Немного другое условия

Нужно вывести фамилию сотрудника, название отдела и общую сумму оплаты за сотрудников этого отдела.
Т.е. у меня пока такой запрос

SELECT staff.fam, departments.name, SUM(Payments.summa)
from departments
join staff on departments.id = staff.dep_id
join Payments on Payments.staff_id = staff.id
group by staff.fam, departments.name


Нужно получить на выходе

fam | name | summa
------------------------
И| Бухгалтерия | 35
П| ИТ | 36
С| Бухгалтерия | 35
Л| Бухгалтерия | 35
д| ИТ | 36
м| Продажи | 40

А мне сейчас выдает

fam | name | summa
------------------------
И| Бухгалтерия | 10
П| ИТ | 20
С| Бухгалтерия | 15
Л| Бухгалтерия | 10
д| ИТ | 16
м| Продажи | 40


Что не так?
6 ноя 14, 19:57    [16808192]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Vladlenmakiyato,

SELECT staff.fam, departments.name, SUM(Payments.summa) OVER (PARTITION BY departments.name)
from departments
join staff on departments.id = staff.dep_id
join Payments on Payments.staff_id = staff.id
6 ноя 14, 20:16    [16808270]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
Vladlenmakiyato
Member

Откуда:
Сообщений: 18
Mind,

Премного благодарен.
6 ноя 14, 20:31    [16808328]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Vladlenmakiyato,
простите, Вы уверены, что Вам именно это надо?!

+
insert into staff (id, fam , dep_id)
values (1 , 'И' , 1), 
(2 , 'П' , 2), 
(3 , 'С' , 1),
(4 , 'Л' , 1),
(5 , 'Д' , 2),
(6 , 'М' , 3)

insert into departments (id , name)
values 
(1 , 'Бухгалтерия'),
(2 , 'ИТ'),
(3 , 'Продажи')

insert into Payments (id , staff_id , summa)
values (1 , 1, 10),
(2 , 2, 20),
(3 , 3, 15),
(4 , 4, 10),
(5 , 5, 16),
(6 , 6, 40)


-- Ещё пачку строк в пэйменты:
insert into Payments (id , staff_id , summa)
values (1 , 1, 10),
(2 , 2, 20),
(3 , 3, 15),
(4 , 4, 10),
(5 , 5, 16),
(6 , 6, 40)


Результат запроса с over partition:

famname(No column name)
И Бухгалтерия 70.00
И Бухгалтерия 70.00
С Бухгалтерия 70.00
С Бухгалтерия 70.00
Л Бухгалтерия 70.00
Л Бухгалтерия 70.00
П ИТ 72.00
П ИТ 72.00
Д ИТ 72.00
Д ИТ 72.00
М Продажи 80.00
М Продажи 80.00
6 ноя 14, 20:54    [16808427]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать сумму зарплат для отдела?  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
может всё-тки вот так:
ФИО Отдел Начислено
И Бухгалтерия 20.00
Л Бухгалтерия 20.00
С Бухгалтерия 30.00
итого по: Бухгалтерия 70.00
Д ИТ 32.00
П ИТ 40.00
итого по: ИТ 72.00
М Продажи 80.00
итого по: Продажи 80.00
итого по: по всем 222.00


... тогда что-то типа:

SELECT isnull(pmnt.fam,'итого по:') as [ФИО], isnull(departments.name,'по всем') [Отдел], sum(pmnt.sum_paid) [Начислено]
from departments
join (select staff.fam, staff.id, staff.dep_id, SUM(Payments.summa) as sum_paid 
from staff join Payments on Payments.staff_id = staff.id
group by staff.fam, staff.id, staff.dep_id) pmnt
on pmnt.dep_id = departments.id
group by departments.name, pmnt.fam  with rollup  
6 ноя 14, 21:27    [16808603]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить