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

Откуда: Moscow
Сообщений: 2767
добрый день!

есть два запроса, выдающие верные данные
запрос 1:
select '7.1' as 'п/п', 'ос и нма' as 'показатели', SUM(a.vitg) as 'входящий', sum(a.iitg) as 'исходящий' from sys_anl.balance201005 a 
where (wbs in ('60401', '60404', '60701', '60702', '60804', '60901', '60905', '61002', '61008', '61009', '61010', '61011')) and (a.regn = 1326)
результат 7 064 132 и 7 248 742 по полям входящий и исходящий соответственно;

запрос 2:
select '7.2' as 'п/п', 'ос и нма' as 'показатели', SUM(a.vitg) as 'входящий', sum(a.iitg) as 'исходящий' from sys_anl.balance201005 a 
where (wbs in ('60601','60805','60903')) and (a.regn = 1326)
результат 3 379 082 и 3 433 598 по полям входящий и исходящий соответственно.

однако необходимо посчитать сумму по перечислеллым кодам wbs запроса 1 за вычетом суммы по кодам wbs запроса 2. пытаюсь писать ровно следующее.
запрос 3:
select '7.3' as 'п/п', 'ос и нма' as 'показатели', (SUM(a.vitg) - SUM (b.vitg)) as 'входящий', (SUM(a.iitg) - SUM(b.iitg)) as 'исходящий' from sys_anl.balance201005 a, sys_anl.balance201005 b
where (a.wbs in ('60401', '60404', '60701', '60702', '60804', '60901', '60905', '61002', '61008', '61009', '61010', '61011')) and (b.wbs in ('60601','60805','60903')) and (a.regn = 1326) and (b.regn = 1326)
выдает ахинею, результат -16 283 474 и -16 404 898.
верный же результат такой 3 685 050 и 3 815 144.

подскажите, пожалуйста, в чем я ошибся, неужели конструкция запроса 3 неприемлема в sql?
Всем спасибо!
19 сен 11, 16:46    [11299882]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
aleks2
Guest
>> в чем я ошибся,
Прогуливал лекции.

;with
[7.1] as
select '7.1' as 'п/п', 'ос и нма' as 'показатели', SUM(a.vitg) as 'входящий', sum(a.iitg) as 'исходящий' from sys_anl.balance201005 a 
where (wbs in ('60401', '60404', '60701', '60702', '60804', '60901', '60905', '61002', '61008', '61009', '61010', '61011')) and (a.regn = 1326)
,
[7.2] as
(
select '7.2' as 'п/п', 'ос и нма' as 'показатели', SUM(a.vitg) as 'входящий', sum(a.iitg) as 'исходящий' from sys_anl.balance201005 a 
where (wbs in ('60601','60805','60903')) and (a.regn = 1326)
)
select '7.3' as 'п/п', 'ос и нма' as 'показатели', (a.входящий - b.входящий) as 'входящий', (a.исходящий - b.исходящий) as 'исходящий'
 from [7.1] a, [7.2] b
19 сен 11, 16:55    [11299971]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
aleks2
>> в чем я ошибся,
Прогуливал лекции.

мил человек, я экономист
19 сен 11, 17:00    [11300014]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
PlanB
, в чем я ошибся, неужели конструкция запроса 3 неприемлема в sql?


FROM sys_anl.balance201005 a, sys_anl.balance201005 b
а зачем вы заставили сделать сервер перемножение двух наборов и удивляетесь неверному результату ?
19 сен 11, 17:01    [11300019]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
aleks2, вы хотите сказать, что конструкция запроса 3 неприменима? очень жаль...ладно
спасибо за помощь!
19 сен 11, 17:02    [11300024]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
PlanB
вы хотите сказать, что конструкция запроса 3 неприменима?

Запрос применим
Неприменима логика, которую вы вкладываете в текст этого запроса
19 сен 11, 17:03    [11300034]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
aleks2
Guest
PlanB
aleks2, вы хотите сказать, что конструкция запроса 3 неприменима? очень жаль...ладно
спасибо за помощь!

Можно и одним, тока зачем? Нафег три сканирования таблицы вместо двух?
19 сен 11, 17:05    [11300048]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
aleks2
Можно и одним, тока зачем? Нафег три сканирования таблицы вместо двух?

Да там вообще все одним сканированием делается
19 сен 11, 17:07    [11300063]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
PlanB
подскажите, пожалуйста, в чем я ошибся


Подсказываю:

1. Изучаете источник данных 1-го запроса.
2. -----//-------//----------- 2-го запроса.
3. -----//-------//----------- 3-го запроса и делаете это ВНИМАТЕЛЬНО!
4. Из изученного делаете выводы.
5. Прекращаете порочную практику перечисления таблиц в клаузе FROM через запятую.

Подсказал? :)
19 сен 11, 17:08    [11300068]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
Glory
aleks2
Можно и одним, тока зачем? Нафег три сканирования таблицы вместо двух?

Да там вообще все одним сканированием делается
как? мне бы покороче строку (на спрашивайте, зачем)
19 сен 11, 17:08    [11300070]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
PlanB
Glory
пропущено...

Да там вообще все одним сканированием делается
как?

Вам как экономисту объяснять или как программисту ?
19 сен 11, 17:11    [11300095]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
Glory
Вам как экономисту объяснять или как программисту ?
не плохо было бы просто его (запрос) написать.
а то у нас с вами неудачный опыт пространных обсуждений на три страницы форума
19 сен 11, 17:13    [11300140]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
PlanB
не плохо было бы просто его (запрос) написать.

11299971
19 сен 11, 18:15    [11300838]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
invm
PlanB
не плохо было бы просто его (запрос) написать.

11299971
по-другому низя? (короче)
20 сен 11, 09:22    [11302636]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
declare @t table (wbs varchar(10), s tinyint);

insert into @t
values
 ('60401', 1),
 ('60404', 1),
 ('60701', 1),
 ('60702', 1),
 ('60804', 1),
 ('60901', 1),
 ('60905', 1),
 ('61002', 1),
 ('61008', 1),
 ('61009', 1),
 ('61010', 1),
 ('61011', 1),
 ('60601', -1),
 ('60805', -1),
 ('60903', -1)
 
select
 '7.1' as 'п/п', 'ос и нма' as 'показатели', SUM(a.vitg * t.s) as 'входящий', sum(a.iitg * t.s) as 'исходящий'
from
 sys_anl.balance201005 a join
 @t t on t.wbs = a.wbs
where
 a.regn = 1326;
20 сен 11, 09:51    [11302812]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
invm, прикольно, конечно, но там может быть много счетов, писать долго...



в любом случае, всем спасибо
20 сен 11, 10:23    [11303045]     Ответить | Цитировать Сообщить модератору
 Re: простой запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
PlanB
invm, прикольно, конечно, но там может быть много счетов, писать долго...

А сейчас вы их типо не пишите в тексте запроса ?
Они сами по себе там берутся ?
20 сен 11, 10:29    [11303076]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить