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

Откуда:
Сообщений: 23
Ребят,всем привет, прошу вашей помощи, буду очень признателен за любой совет)
(select SUM(case es.payStatus_ID when 1 then w.price else 0 end)
 FROM estimate as es
 INNER JOIN dbo.service s ON s.service_ID = es.service_ID
 INNER JOIN dbo.work w ON w.work_ID = s.work_ID
 where es.auto_ID = e.auto_ID) as "Сумма оплаченная клиентом",
 
 (select SUM(case es.payStatus_ID when 2 then w.price else 0 end)
 FROM estimate as es
 INNER JOIN dbo.service s ON s.service_ID = es.service_ID
 INNER JOIN dbo.work w ON w.work_ID = s.work_ID
 where es.auto_ID = e.auto_ID) as "Сумма не оплаченная клиентом"


Есть часть запроса, которая отвечает за два столбца , и я понимаю, что это не совсем корректно, не могли бы подсказать как модернизировать его.
10 янв 17, 21:17    [20091273]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
select
 ...
 t.[Сумма оплаченная клиентом],
 t.[Сумма не оплаченная клиентом]
from
 ... outer apply
 (
  select
   sum(case es.payStatus_ID when 1 then w.price else 0 end),
   sum(case es.payStatus_ID when 2 then w.price else 0 end)
  from
   estimate as es
   inner join dbo.service s on s.service_ID = es.service_ID
   inner join dbo.work w on w.work_ID = s.work_ID
  where
   es.auto_ID = e.auto_ID and
   es.payStatus_ID in (1, 2)
 ) t ([Сумма оплаченная клиентом], [Сумма не оплаченная клиентом])
10 янв 17, 22:01    [20091361]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение запроса  [new]
ba3uk
Member

Откуда:
Сообщений: 23
invm, можете подсказать как это подкрутить сюда, опыта не хватает


SELECT  e.auto_ID as "Номер авто",
c.surname as "Фамилия клиента",



(select SUM(case es.payStatus_ID when 1 then w.price else 0 end)
 FROM estimate as es
 INNER JOIN dbo.service s ON s.service_ID = es.service_ID
 INNER JOIN dbo.work w ON w.work_ID = s.work_ID
 where es.auto_ID = e.auto_ID) as "Сумма оплаченная клиентом",
 
 (select SUM(case es.payStatus_ID when 2 then w.price else 0 end)
 FROM estimate as es
 INNER JOIN dbo.service s ON s.service_ID = es.service_ID
 INNER JOIN dbo.work w ON w.work_ID = s.work_ID
 where es.auto_ID = e.auto_ID) as "Сумма не оплаченная клиентом"
 
FROM estimate as e
INNER JOIN dbo.service s ON s.service_ID = e.service_ID
INNER JOIN dbo.work w ON w.work_ID = s.work_ID
INNER JOIN dbo.payStatus pS ON pS.payStatus_ID =  e.payStatus_ID
INNER JOIN dbo.auto au ON au.auto_ID = e.auto_ID
INNER JOIN dbo.client c ON c.client_ID =au.client_ID


Group by e.auto_ID ,c.surname
10 янв 17, 22:10    [20091379]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
SELECT
 e.auto_ID as "Номер авто",
 c.surname as "Фамилия клиента",
 SUM(case e.payStatus_ID when 1 then w.price else 0 end) as "Сумма оплаченная клиентом",
 SUM(case e.payStatus_ID when 2 then w.price else 0 end) as "Сумма оплаченная не клиентом"
FROM estimate as e
INNER JOIN dbo.service s ON s.service_ID = e.service_ID
INNER JOIN dbo.work w ON w.work_ID = s.work_ID
INNER JOIN dbo.payStatus pS ON pS.payStatus_ID =  e.payStatus_ID
INNER JOIN dbo.auto au ON au.auto_ID = e.auto_ID
INNER JOIN dbo.client c ON c.client_ID =au.client_ID
GROUP BY
e.auto_ID ,c.surname
10 янв 17, 22:33    [20091477]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение запроса  [new]
aleks2
Guest
invm
SELECT
 e.auto_ID as "Номер авто",
 c.surname as "Фамилия клиента",
 SUM(case e.payStatus_ID when 1 then w.price else 0 end) as "Сумма оплаченная клиентом",
 SUM(case e.payStatus_ID when 2 then w.price else 0 end) as "Сумма оплаченная не клиентом"
FROM estimate as e
INNER JOIN dbo.service s ON s.service_ID = e.service_ID
INNER JOIN dbo.work w ON w.work_ID = s.work_ID
INNER JOIN dbo.payStatus pS ON pS.payStatus_ID =  e.payStatus_ID
INNER JOIN dbo.auto au ON au.auto_ID = e.auto_ID
INNER JOIN dbo.client c ON c.client_ID =au.client_ID
GROUP BY
e.auto_ID ,c.surname


Позор. Две лишние таблицы под группировкой.
А потом тредстартер будет скулить: "медленно работает"
11 янв 17, 07:05    [20092044]     Ответить | Цитировать Сообщить модератору
 Re: Упрощение запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
aleks2
Позор. Две лишние таблицы под группировкой.

1. "Под группировкой" ничего лишнего нет. Есть лишняя таблица, которую вообще нужно выкинуть из запроса.
2. Пора бы тебе уже уяснить - оптимизатор не дурак и умеет самостоятельно убирать лишнее из "под группировкой".
11 янв 17, 10:43    [20092498]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить