Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Помогите оптимизировать запрос db2

Помогите оптимизировать запрос. Выглядит он монстрообразно.

select distinct  PUBLSEQ from PUBLCOVER P
      WHERE EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA = 1823
        )
      AND NOT EXISTS
      ( SELECT * FROM PUBLCOVER A, XCOVERAREA B, XPRODCODEDICT C
        WHERE A.PUBLSEQ = P.PUBLSEQ
        AND A.COVER_STATUS = 'Y'
        AND A.COVAREA = B.COVAREA
        AND B.COVAREA_PRODCODE IS NOT NULL
        AND B.COVAREA_PRODCODE = C.PRODCODE
        AND C.STATUS = 'A'
        AND A.COVAREA NOT IN (1823, 34)
        )


Очень бы хотелось избавиться от EXISTS или NOT EXISTS, оставив один из них.
Ответ: Давно искал, нужно для курсовой)
Вопрос: оптимизировать запрос помогите PLZ!

Помогите оптимизировать запрос!
Есть 2 вьюхи одинаковые, но с разным условием по дате (TODATE). Вьюхи называются TOMORROWRETAILPRICE_LMA_TEST и TODAYRETAILPRICE_LMA_TEST. Пример одной вьюхи ниже.
Таблица RETAILPRICESTRANS_LMA_TEST 35 млн строк единственная более-менее большая (6ГБ) в этом запросе.

идея такая: нужно вычислять дельту изменений между 2 вьюхами за определенную дату вот таким запросом (см. ниже).
План запроса во вложении. Как видно, основное время тратится на сортировки, но я не знаю как по другому переписать запрос.

SELECT * FROM
( SELECT
A.[RetailStoreRecId],
A.STORENUMBER,
A.ProductNumber,
A.ProductRecId,
isnull(A.[RetailPrice],0) AS PRICE,
isnull(B.[RetailPrice],0) AS PRICE2,
isnull(A.[OK],0) AS OK,
isnull(B.[OK],0) AS OK2,
A.CAMPAIGNID, B.CAMPAIGNID AS CAMPAIGNID2,
IIF(A.[CAMPAIGNID] <> '',1,0) AS FIXPRICE
FROM dbo.[TOMORROWRETAILPRICE_LMA_TEST] AS A
inner join RETAILSTORETABLE_LMA st on st.RETAILSTORETABLE = A.[RetailStoreRecId] AND st.ISACTIVE = 1
LEFT OUTER JOIN [TODAYRETAILPRICE_LMA_TEST] AS B ON A.ProductNumber = B.ProductNumber AND A.RetailStoreRecId = B.RetailStoreRecId ) as C
WHERE (C.PRICE <> C.PRICE2 OR C.OK <> C.OK2) ORDER BY C.[RetailStoreRecId]

код вьюхи. Другая точно такая же, но с другим условием по дате.

SELECT    Store.recId AS RetailStoreRecId, Store.STORENUMBER AS STORENUMBER, Product.DISPLAYPRODUCTNUMBER AS ProductNumber, Product.recid AS ProductRecId,

CAST
                             ((SELECT  TOP 1   TR.PRICE AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS money) AS RetailPrice,

CAST
                             ((SELECT        TOP 1 dbo.RETAILDISCOUNTTRANS_LMA.PRICEORPERCENT AS Expr1
                                 FROM            dbo.RETAILDISCOUNTTRANS_LMA 
                                 WHERE				dbo.RETAILDISCOUNTTRANS_LMA.PARTITION = 5637144576 AND 
													dbo.RETAILDISCOUNTTRANS_LMA.DISCOUNTSTYPE = 10 AND dbo.RETAILDISCOUNTTRANS_LMA.ENABLED = 1 AND
													dbo.RETAILDISCOUNTTRANS_LMA.product = Product.recid AND 
													dbo.RETAILDISCOUNTTRANS_LMA.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE())) AND 
													dbo.RETAILDISCOUNTTRANS_LMA.TODATE >= DATEADD(day, 1, convert(date, GETDATE())) AND 
                                                    dbo.RETAILDISCOUNTTRANS_LMA.CHANNEL = Store.RECID ORDER BY DISCOUNTID DESC) AS money) AS OK,


CAST
                             ((SELECT  TOP 1 C.CAMPAIGNID AS Expr1 
                                 FROM            dbo.[RETAILPRICESTRANS_LMA_TEST] AS TR 
								 LEFT OUTER JOIN dbo.SMMCAMPAIGNTABLE AS C ON C.PARTITION = 5637144576 AND C.DATAAREAID = 'LTG' AND C.RECID = TR.SOURCERECID
                                 WHERE			(TR.PARTITION = 5637144576) AND
												(TR.ENABLED = 1) AND 
												(TR.CHANNEL = Store.RECID) AND 
												(TR.PRODUCT = Product.recId) AND
												(TR.FROMDATE <= DATEADD(day, 1, convert(date, GETDATE()))) AND
												(TR.TODATE	>= DATEADD(day, 1, convert(date, GETDATE())))
												ORDER BY TR.PRIORITY ASC, TR.CREATEDDATETIMELOCK DESC ) AS varchar) AS CampaignId


FROM            dbo.RETAILCHANNELTABLE AS Store 

CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 
Ответ:
i-i
виноват, "анонимного пользователя"

ТСу - а вы укажите оптимизатиру чтобы он исползовал новые индексы with (index = yourindexname), иногда помогает


Заслышав бубен - запляшут духи...

PS. Я, канешно не знаю чего там у тредстартера напихано в
dbo.RETAILCHANNELTABLE и dbo.ECORESPRODUCT

НО! если допустить, что

FROM            dbo.RETAILCHANNELTABLE AS Store 
CROSS JOIN dbo.ECORESPRODUCT AS Product 
GROUP BY Store.recId, Store.STORENUMBER, Product.DISPLAYPRODUCTNUMBER, Product.recId 


имеет смысл, то даже вот так

FROM  ( select distinct recId, STORENUMBER from dbo.RETAILCHANNELTABLE ) AS Store 
CROSS JOIN ( select distinct DISPLAYPRODUCTNUMBER, recId from dbo.ECORESPRODUCT ) AS Product 

будет гораздо эффективнее.
Хотя меня сильно смущают recId...
Вопрос: Оптимизировать запрос

Будьте так любезны уважаемые форумчане, помогите оптимизировать запрос:
UPDATE contacts SET operator_id=(SELECT operator_id FROM ru_operator_data_new WHERE INSTR( SUBSTR( phone, 2 ) , ru_operator_data_new.oper_prefix)  =1 ORDER BY LENGTH( oper_prefix ) DESC LIMIT 1)


Таблички:

contacts:
operator_id INTEGER NULL
phone CHAR(255) 79050000000


ru_operator_data_new:
oper_prefix VARCHAR(20) 1
operator_id INTEGER 9050


Если допустим в базе 2000 записей выполняется, минут 20 этот запрос. Если ли способ его оптимизировать ?
Ответ: Нет. Непонятно.

Читай инструкцию: 13467826
Вопрос: Помогите составить запрос выбрать n предыдущих строк с учётом ORDER BY

Уважаемые форумчане, помогите составить запрос.
Есть некоторый запрос типа SELECT * FROM table ORDER BY field.
В table есть колонка id.
Задано некоторое конкретное id( пусть равное 8)
нужно взять несколько строк из результата запроса, стоящих перед id=8.
field может быть составным, потому использовать его во WHERE нежелательно
Ответ:
RenusAvin
Уважаемые форумчане, помогите составить запрос.
Есть некоторый запрос типа SELECT * FROM table ORDER BY field.
В table есть колонка id.
Задано некоторое конкретное id( пусть равное 8)
нужно взять несколько строк из результата запроса, стоящих перед id=8.
field может быть составным, потому использовать его во WHERE нежелательно



приведите конкретный пример.
то у вас по ИД надо сортировать, то по какомутп "филду"
Вопрос: Сводная таблица, подскажите как оптимизировать запрос

Доброе время суток!
Столкнулся вот с такой задачей:
Нужно выбрать с таблицы в сводную данные по учащимся по типу формы обучения с распределением по возрасту, должно получиться что-то типа как в запросе что описан ниже:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TRANSFORM COUNT(zZv.ФИО) AS [Count-ФИО]
SELECT zZv.[Форма]
FROM zZv
GROUP BY zZv.[Форма]
PIVOT iif(zZv.date_v< 15,"<15",
iif(zZv.date_v = 15,"15",iif(zZv.date_v = 16,"16",
iif(zZv.date_v = 17,"17",iif(zZv.date_v = 18,"18",
iif(zZv.date_v = 19,"19",
iif(zZv.date_v = 20,"20",iif(zZv.date_v = 21,"21",
iif(zZv.date_v = 22,"22",iif(zZv.date_v = 23,"23",
iif(zZv.date_v = 24,"24",iif(zZv.date_v = 25,"25",
iif(zZv.date_v = 26,"26",iif(zZv.date_v = 27,"27",
iif(zZv.date_v = 28,"28",iif(zZv.date_v = 29,"29",
iif(zZv.date_v = BETWEEN 30 AND 34,"30-34",
iif(zZv.date_v > 34,">34"))))))))))))))))));
Но при запуске:
Ошибка: Слишком сложное выражение в выражении запроса!

Помогите плз оптимизировать запрос.
Ответ: Нет, так Вы нужного порядка не получите. У пивот-запроса свои правила.
Надо в исходном запросе zZv образовать поле dt_v:
SQL
1
iif(zZv.date_v IS NULL, "Возраст не указан", iif(zZv.date_v< 15,"<15", iif(zZv.date_v>34, "34>", iif(zZv.date_v BETWEEN 30 AND 34, "30-34", cstr(zZv.date_v))))) AS dt_v
А в пивоте перекрестного задать нужный порядок dt_v в предложении In
SQL
1
Pivot dt_v IN("<15","15","16",...,"30-34","34>")
Вопрос: Помогите оптимизировать запрос

Есть sql-запрос:

SELECT `t1`.`uid`, `t1`.`created_at`, `t2`.`count` AS `count` FROM `stats` `t1` 
INNER JOIN (SELECT `uid`, `created_at`, COUNT(uid) AS `count` FROM `stats` GROUP BY `uid`) `t2` ON t1.uid = t2.uid 
WHERE ((`t1`.`uid` NOT IN (9421802727)) AND (`t1`.`ip` NOT IN (3579284812))) 
AND (`t2`.`created_at` BETWEEN 't2.created_at' AND DATE_ADD(t1.created_at, INTERVAL -21 DAY)) 
GROUP BY `t1`.`uid` ORDER BY `count` DESC LIMIT 10


Суть в чем, нужно выбрать только те uid которые заходили на сайт в течение 21 дня и более. Все в принципе выбирается и работает, но запрос выполняется примерно пол секунды(что долго, ибо на странице до десятка подобных запросов с разными датами и условиями).

Ребят, как смог, так и оптимизировал, но чувствую, что можно как то еще. Не слишком силен в БД поэтому пишу здесь.

p.s. на ip и uid в таблице стоят индексы.
Ответ:
araman
MasterZiv,

Как я вижу в 1 посте я про это упомянул.


Так надо не упоминать, а дать вывод

show treate table


Индексы бывают разные, и то, что ты считаешь под "в таблице стоят индексы", может означать всё, что угодно.
Вопрос: Как оптимизировать запрос с Left Join?

Есть такой запрос, выполняется очень долго (30 секунд), в базе в таблице news 85 тысяч записей, а в rels 45 миллионов.
Помогите пожалуйста оптимизировать запрос.

PHP
1
2
3
4
5
6
7
8
9
10
11
//сама новость
$result = mysqli_query($con, "SELECT * FROM news WHERE id = $id");
$row = mysqli_fetch_assoc($result);
print_r($row);
 
//похожие новости
$result = mysqli_query($con, "SELECT similar_id, news.title, news.text, news.link FROM rels LEFT JOIN news ON news.id = rels.similar_id WHERE rels.news_id = $id LIMIT 100");
while($row = mysqli_fetch_assoc($result))
{
    print_r($row);
}
Ответ:
Сообщение от monavista
Если надо заплатить за оптимизацию - готов
Имелось ввиду вот это:
Или выше озвучили: EXPLAIN.
Это покажет где в запросе тормоза.
Вопрос: Помогите оптимизировать запрос.

Попался проект, все тормозит, выявил что проблема как раз в запросе, один он выполняется только 10 секуд... но не погу понять как его оптимизировать. Собственно сам запрос
PHP:

  1.  
  2. select o.*, x.last_date
  3. from ( select c.object_key, (c.object_call_date) as last_date from OEo_object_calls c group by c.object_key )x
  4. right OEo_objects o on o.object_key=x.object_key
  5. where `object_city`='1' and `object_status_id`=3 order by x.last_date ASC LIMIT 0, 20;
  6.  

В oeo_object_calls - Хранится ключ услуги, и дата прозвона
а в OEo_objects - хранятся сами услуги.
Ответ:
Эээ... ожно скромно влезть? Кажется мускул умеет адаптивный хэш индекс в мемори
Но управлять им не получится
Не?


-----
Аккаунт был удален
Вопрос: Помогите оптимизировать схему данных

create table t(a int, b int, c int, d int, c int, d int);
go

select * from t where a = @p_a and b = @p_b and c > @p_c
go


надо оптимизировать запрос
Ответ:
Маргарита1995
Leonid Kudryavtsev
создать составной индекс по полям a,b,c


А есть разница между двумя вариантами:

a,b,c
b,a,c

для данного конкретного запроса.



не должно быть разницы.
Вопрос: Помогите оптимизировать запросы

Три таблицы: фирмы (firms), журнал заявок (jurnal), поступления (credit)

+ Дамп:
--
-- База данных: `reestrz`
-- 

-- --------------------------------------------------------

--
-- Структура таблицы `credit`
--

CREATE TABLE IF NOT EXISTS `credit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_jur` int(9) NOT NULL DEFAULT '0',
`id_firm` int(9) NOT NULL DEFAULT '0',
`postup` decimal(10,2) NOT NULL DEFAULT '0.00',
`datapost` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_jur` (`id_jur`),
KEY `id_firm` (`id_firm`),
KEY `postup` (`postup`),
KEY `datapost` (`datapost`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=85 ;

--
-- Дамп данных таблицы `credit`
--

INSERT INTO `credit` (`id`, `id_jur`, `id_firm`, `postup`, `datapost`) VALUES
(1, 1, 2, 1161.12, '2012-01-12'),
(2, 2, 2, 2485.08, '2012-01-12'),
(3, 3, 2, 1600.00, '2012-03-22'),
(4, 4, 2, 800.00, '2012-11-19'),
(5, 5, 3, 6119.27, '2012-03-21'),
(6, 5, 3, 5065.53, '2012-04-13'),
(7, 5, 3, 7054.35, '2012-05-28'),
(8, 5, 3, 5065.53, '2012-06-27'),
(9, 5, 3, 7782.80, '2012-07-24'),
(10, 5, 3, 12210.95, '2012-08-30'),
(11, 5, 3, 11885.66, '2012-10-04'),
(12, 5, 3, 7823.19, '2012-10-24'),
(13, 5, 3, 10248.02, '2012-12-07'),
(14, 5, 3, 2802.34, '2012-02-02'),
(15, 5, 3, 6804.26, '2012-12-26'),
(16, 6, 3, 4000.00, '2013-03-07'),
(17, 6, 3, 11406.15, '2013-03-07'),
(18, 6, 3, 15200.00, '2013-03-25'),
(19, 6, 3, 6221.02, '2013-03-25'),
(20, 6, 3, 11200.00, '2013-04-23'),
(22, 6, 3, 7117.82, '2013-05-24'),
(26, 6, 3, 2800.00, '2013-07-24'),
(27, 6, 3, 9733.90, '2013-07-24'),
(28, 6, 3, 4800.00, '2013-07-24'),
(29, 5, 3, 5424.25, '2013-01-17'),
(30, 6, 3, 1313.57, '2013-08-26'),
(31, 6, 3, 3200.00, '2013-08-26'),
(32, 6, 3, 800.00, '2013-08-26'),
(33, 6, 3, 5600.00, '2013-09-24'),
(34, 6, 3, 11975.90, '2013-09-26'),
(35, 6, 3, 12004.44, '2013-10-23'),
(36, 6, 3, 4800.00, '2013-10-24'),
(37, 6, 3, 3200.00, '2013-11-25'),
(38, 6, 3, 7566.22, '2013-11-25'),
(39, 6, 3, 7200.00, '2013-12-27'),
(40, 6, 3, 11406.16, '2013-12-24'),
(41, 6, 3, 7600.00, '2014-01-20'),
(42, 6, 3, 7566.22, '2014-01-20'),
(44, 7, 3, 8379.38, '2014-03-25'),
(45, 8, 3, 8400.00, '2014-04-09'),
(47, 8, 3, 8000.00, '2014-04-24'),
(48, 7, 3, 8850.20, '2014-05-27'),
(49, 8, 3, 9600.00, '2014-06-25'),
(50, 7, 3, 13576.07, '2014-06-25'),
(51, 8, 3, 4000.00, '2014-07-25'),
(52, 7, 3, 6959.86, '2014-07-25'),
(53, 8, 3, 4400.00, '2014-08-25'),
(54, 7, 3, 12134.13, '2014-08-25'),
(55, 8, 3, 5600.00, '2014-10-22'),
(56, 7, 3, 11820.24, '2014-10-24'),
(57, 8, 3, 5600.00, '2014-10-24'),
(58, 7, 3, 8686.20, '2014-10-28'),
(59, 8, 3, 7600.00, '2014-11-26'),
(60, 7, 3, 6877.24, '2014-11-26'),
(61, 8, 3, 7600.00, '2014-02-21'),
(62, 8, 3, 14400.00, '2014-05-27'),
(63, 8, 3, 1200.00, '2015-01-27'),
(64, 7, 3, 7818.85, '2015-01-27'),
(65, 9, 3, 9713.66, '2015-02-24'),
(66, 10, 3, 7542.56, '2015-02-24'),
(67, 9, 3, 6720.30, '2015-03-24'),
(68, 10, 3, 7986.24, '2015-04-21'),
(69, 11, 4, 2200.61, '2012-05-16'),
(70, 11, 4, 2047.98, '2012-10-19'),
(71, 11, 4, 2047.98, '2012-10-26'),
(75, 12, 4, 3236.74, '2013-07-24'),
(76, 12, 4, 2099.22, '2013-11-14'),
(77, 13, 4, 13510.17, '2014-06-06'),
(78, 13, 4, 7290.43, '2014-09-10'),
(79, 13, 4, 1070.71, '2014-11-20'),
(80, 14, 5, 2990.88, '2012-04-16'),
(81, 14, 5, 2388.75, '2012-08-06'),
(82, 15, 5, 2000.46, '2013-01-17'),
(84, 17, 5, 2203.89, '2012-11-20');

-- --------------------------------------------------------

--
-- Структура таблицы `firms`
--

CREATE TABLE IF NOT EXISTS `firms` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`n_short` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

--
-- Дамп данных таблицы `firms`
--

INSERT INTO `firms` (`id`, `n_short`) VALUES
(1, 'не указано'),
(2, 'Западная компания'),
(3, 'Северная компания'),
(4, 'Восточная компания'),
(5, 'Южная компания'),
(6, 'Северо-Восточная компания'),
(7, 'Юго-Западная компания');

-- --------------------------------------------------------

--
-- Структура таблицы `jurnal`
--

CREATE TABLE IF NOT EXISTS `jurnal` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`id_firm` int(9) NOT NULL DEFAULT '0',
`sumdoc` decimal(10,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`),
KEY `id_firm` (`id_firm`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;

--
-- Дамп данных таблицы `jurnal`
--

INSERT INTO `jurnal` (`id`, `id_firm`, `sumdoc`) VALUES
(1, 2, 1161.12),
(2, 2, 2485.08),
(3, 2, 1600.00),
(4, 2, 800.00),
(5, 3, 88286.15),
(6, 3, 232231.44),
(7, 3, 88799.37),
(8, 3, 125045.67),
(9, 3, 112535.31),
(10, 3, 82524.48),
(11, 4, 22162.85),
(12, 4, 6296.57),
(13, 4, 21871.30),
(14, 5, 5379.63),
(15, 5, 2822.56),
(16, 5, 17414.12),
(17, 5, 2203.89),
(18, 6, 5384.16); 

1. Получаю все данные по всем заявкам и фирмам, количество заявок, количество поступлений и их суммы
+ 1 запрос:
SELECT
company.`n_short`
, COUNT(*) as count_zayav
, SUM(`sumdoc`) as sum_zayav
, IFNULL(cred.`cntcr`,0) as count_post
, IFNULL(cred.`sumpost`,0) as sum_post
, IFNULL(SUM(`sumdoc`)-IFNULL(cred.`sumpost`,0),0) as debet
FROM `firms` company, `jurnal` 
LEFT JOIN
(SELECT
IFNULL(COUNT(`id`),0) AS cntcr
, IFNULL(SUM(`postup`),0) AS sumpost
, `id_firm`
, `id_jur`
FROM `credit`
GROUP BY `id_firm`
) cred ON cred.`id_jur`=jurnal.`id`
WHERE jurnal.`id_firm`=company.`id`
GROUP BY company.`id`

+ Результат 1:
n_shortcount_zayavsum_zayavcount_postsum_postdebet
Западная компания46046.2046046.200.00
Северная компания6729422.4258438462.48290959.94
Восточная компания350330.72833503.8416826.88
Южная компания427820.2049583.9818236.22
Северо-Восточная компания15384.1600.005384.16

2. Получаю количество заявок, поступлений и их суммы для которых debet=0.
+ 2 запрос:
SELECT
firms.`n_short`,
  COUNT(DISTINCT jurnal.`id`) as count_zayav, 
  SUM(jurnal.`sumdoc`) as sum_zayav,
  cred.`count_post`,
  cred.`sum_post`
FROM 
  `jurnal` , `firms`
LEFT JOIN 
 (
	SELECT
 		COUNT( credit.`id`) as count_post,
 		SUM(credit.`postup`) as sum_post,
		credit.`id_firm`
	FROM `firms` , `credit` 
	WHERE  
 		credit.`id_jur` IN
   	(
     	SELECT DISTINCT jurnal.`id` 
     	FROM `jurnal` 
     	WHERE 
	     jurnal.`id`  IN
   	   ( 
      		SELECT `id_jur` 
      		FROM `credit` 
      		WHERE credit.`id_jur`=jurnal.`id`
       		HAVING( jurnal.`sumdoc`=IFNULL(SUM(credit.`postup`),0) )
     	    )
  	 )
	AND firms.`id`=credit.`id_firm`
	GROUP BY credit.`id_firm`
 ) cred ON firms.`id`=cred.`id_firm`
WHERE
  jurnal.`id`  IN
  ( 
   SELECT DISTINCT `id_jur` FROM `credit` WHERE credit.`id_jur`=jurnal.`id`
   HAVING( jurnal.`sumdoc`=IFNULL(SUM(credit.`postup`),0) )
  ) 
AND firms.`id`=jurnal.`id_firm`
GROUP BY firms.`id` 

+ Результат 2:
n_shortcount_zayavsum_zayavcount_postsum_post
Западная компания46046.2046046.20
Северная компания188286.151288286.15
Южная компания27583.5237583.52
Ответ: EXPLAIN такой же