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

Откуда:
Сообщений: 6
Здравствуйте!

Никак не могу понять как решить следующую задачу. Пусть в базе данных есть 3 таблицы. Первая - список клиентов компании, вторая - стоимость услуг оказываемых компанией и третья - журнал, в котором записываются дана, время, клиент и оказанная ему услуга. Стоимость услуги зависит от пола клиента (предположим компания - это парикмахерская), для женщин она одна, для мужчин другая.

Задача состоит в следующем: вывести всех клиентов (поименно) и для каждого посчитать суммарную стоимость оказанных ему услуг за все время.
12 дек 15, 16:29    [18550955]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Harb
Сложный запрос
Не сложный, а базовый.
Без этого в реляционной базе делать нечего.
Читать про JOIN, агрегатные функции, SUM(), GROUP BY и т.д.
12 дек 15, 16:32    [18550962]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Harb
Member

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

Можно поподробнее насчет "и т.д." Какими конкретно конструкциями языка можно обойтись в данном случае? Для меня самое непонятное - это то, как запихнуть в один столбец сумму по и для мужчин и для женщин.
12 дек 15, 17:17    [18551134]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Harb
Какими конкретно конструкциями языка можно обойтись в данном случае?

" JOIN, агрегатные функции, SUM(), GROUP BY"
12 дек 15, 17:33    [18551180]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Harb
Member

Откуда:
Сообщений: 6
Я написал следующий запрос:

select client.iid, sum(services.cost_male) as 'sum' from clents full outer join works on clients.iid=works.client_id full join services on 
services.iid=works.service_id group by client.iid order by sum;


Запрос не верен. Т.к. он суммирует для каждого клиента цены услуг для мужчин, даже если клиент является женщиной. Можно дать наводку, как мне его исправить так, чтобы суммировались нужные значение?
12 дек 15, 18:08    [18551282]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
select client.iid, 
CASE 
	WHEN client.gender = 'dude'
	THEN  SUM(services.cost_male)
	ELSE SUM(services.cost_female)
end as 'sum' 
FROM clents 
JOIN works 
	ON clients.iid=works.client_id 
JOIN services 
	ON services.iid=works.service_id 
GROUP by client.iid 
ORDER by sum;
12 дек 15, 18:15    [18551297]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Harb
Member

Откуда:
Сообщений: 6
Rankatan, спасибо! Это работает. Но можно ли обойтись без CASE конструкции? Используя лишь join, sum() и group by?
12 дек 15, 18:23    [18551318]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
select client.iid, SUM(services.cost_male) as 'sum' 
FROM clents 
JOIN works 
	ON clients.iid=works.client_id 
JOIN services 
	ON services.iid=works.service_id 
WHERE client.gender = 'dude'
GROUP by client.iid 
UNION ALL 
select client.iid, SUM(services.cost_female) as 'sum' 
FROM clents 
JOIN works 
	ON clients.iid=works.client_id 
JOIN services 
	ON services.iid=works.service_id 
WHERE client.gender != 'dude'
GROUP by client.iid 
ORDER by sum;
12 дек 15, 18:25    [18551324]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Harb
Member

Откуда:
Сообщений: 6
Rankatan, круто! :) Большое спасибо!
Но, товарищи со 100 000 сообщений утверждают, что можно обойтись " JOIN, агрегатные функции, SUM(), GROUP BY", т.е. без UNION. Вот я и ломаю голову и думаю: возможно ли это?
12 дек 15, 18:42    [18551378]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Harb,

это лабораторная работа в университете? Потому что в нашей суровой реальности, если услуга зависит от пола, в прейскурант вносят 2 услуги:
1) женская стрижка - 500 р
2) мужская стрижка - 200 р
И тогда не нужно никаких CASE и т.п. Женщинам начисляем услугу 1, мужчинам - услугу 2. И дальше уже обычный SUM c GROUP BY.
12 дек 15, 19:09    [18551447]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
Harb
Member

Откуда:
Сообщений: 6
Сид, вы угадали, я действительно делаю лабораторную работу в университете. Хотя задача звучит немного по-другому. Я просто выделил в ней то, что мне не понятно и сам придумал упрощенный аналогичный пример. Возможно не самый удачный.
12 дек 15, 19:13    [18551461]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Harb
Rankatan, круто! :) Большое спасибо!
Но, товарищи со 100 000 сообщений утверждают, что можно обойтись " JOIN, агрегатные функции, SUM(), GROUP BY", т.е. без UNION. Вот я и ломаю голову и думаю: возможно ли это?
Чтобы суммировать отдельно для мужчин и женщин, можно суммировать так: SUM(CASE WHEN sex='М' THEN поле ELSE 0 END).
Просто SUM(поле) даст общую сумму.
12 дек 15, 21:01    [18551827]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
Harb
Я написал следующий запрос:

select client.iid, sum(services.cost_male) as 'sum' from clents full outer join works on clients.iid=works.client_id full join services on 
services.iid=works.service_id group by client.iid order by sum;


Запрос не верен. Т.к. он суммирует для каждого клиента цены услуг для мужчин, даже если клиент является женщиной. Можно дать наводку, как мне его исправить так, чтобы суммировались нужные значение?


на счет мужчин и женщин и услуг - у тебя неверная постановка немного, это не цены услуг зависит от пола, а услуги сами разделены на мужские и женские, а цены у них одинаковые должны быть хотя-бы на основе ГК РФ да и вообще здравого смысла. при этом услуги также могут оказываться лицам другого пола, а могут и не оказываться, это зависит от здравого смысла и характера услуг. Например, женщину можно подстричь "под мальчика" в мужском зале, и наоборот мужчина с длинными волосами может сделать себе "химию", а вот УЗИ матки мужчине никак не получится сделать.

при этом в бд как правило и не нужны никакие ограничения на этот счет, потому что чисто административного ограничения для этого достаточно, и наоборот, если что, добавляет гибкость системе. захотела женщина в мужском зале под ноль побриться - пожалуйста...


так что тебе надо сами услуги разносить, а под из стоимости убирать.
13 дек 15, 09:03    [18553373]     Ответить | Цитировать Сообщить модератору
 Re: Сложный запрос. Помогите разобраться.  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
Rankatan
[src]

WHEN client.gender = 'dude'
THEN SUM(services.cost_male)
ELSE SUM(services.cost_female)
end as 'sum'


у тебя еще и нарушение 1НФ ...
меняй бд
13 дек 15, 09:06    [18553374]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить