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

Откуда:
Сообщений: 9
Доброе утро!!!

Написала запрос, результат то что нужно

Select TCPARTNER.CPARTNER,
(SELECT ISNULL(SUM(IIF(TRT_2.[COLUMN]='3' ,NSUM,0)),0) FROM Data000 INNER JOIN TRT_2 ON Data000.C2ID01=TRT_2.C2ID01 AND Data000.C2ID18=TRT_2.C2ID18 AND Data000.IYEAR=@IYEAR AND Data000.IMONTH >=@PF and Data000.IMONTH<= @PT and Data000.C2ID10>=@COMP1 and Data000.C2ID10<=@COMP1 and Data000.CPARTNER>=@PCOMP1 and Data000.CPARTNER<=@PCOMP2 AND Data000.CPARTNER=TCPARTNER.CPARTNER ) AS "3",
(SELECT ISNULL(SUM(IIF(TRT_2.[COLUMN]='4' ,NSUM,0)),0) FROM Data000 INNER JOIN TRT_2 ON Data000.C2ID01=TRT_2.C2ID01 AND Data000.C2ID18=TRT_2.C2ID18 AND Data000.IYEAR=@IYEAR AND Data000.IMONTH >=@PF and Data000.IMONTH<= @PT and Data000.C2ID10>=@COMP1 and Data000.C2ID10<=@COMP1 and Data000.CPARTNER>=@PCOMP1 and Data000.CPARTNER<=@PCOMP2 AND Data000.CPARTNER=TCPARTNER.CPARTNER ) AS "4",
(SELECT ISNULL(SUM(IIF(TRT_2.[COLUMN]='5' ,NSUM,0)),0) FROM Data000 INNER JOIN TRT_2 ON Data000.C2ID01=TRT_2.C2ID01 AND Data000.C2ID18=TRT_2.C2ID18 AND Data000.IYEAR=@IYEAR AND Data000.IMONTH >=@PF and Data000.IMONTH<= @PT and Data000.C2ID10>=@COMP1 and Data000.C2ID10<=@COMP1 and Data000.CPARTNER>=@PCOMP1 and Data000.CPARTNER<=@PCOMP2 AND Data000.CPARTNER=TCPARTNER.CPARTNER ) AS "5",
(SELECT ISNULL(SUM(IIF(TRT_2.[COLUMN]='6' ,NSUM,0)),0) FROM Data000 INNER JOIN TRT_2 ON Data000.C2ID01=TRT_2.C2ID01 AND Data000.C2ID18=TRT_2.C2ID18 AND Data000.IYEAR=@IYEAR AND Data000.IMONTH >=@PF and Data000.IMONTH<= @PT and Data000.C2ID10>=@COMP1 and Data000.C2ID10<=@COMP1 and Data000.CPARTNER>=@PCOMP1 and Data000.CPARTNER<=@PCOMP2 AND Data000.CPARTNER=TCPARTNER.CPARTNER ) AS "6"
FROM TCPARTNER GROUP BY TCPARTNER.CPARTNER

Но мне не нравится что в запросе для каждого столбца написан один и тот же фильтр. Оптимизировать не получается, выходит ошибка

Select TCPARTNER.CPARTNER,
( Select ISNULL(SUM(IIF(TRT_2.[COLUMN]='3' ,NSUM,0)),0) AS "3",
ISNULL(SUM(IIF(TRT_2.[COLUMN]='4' ,NSUM,0)),0) AS "4",
ISNULL(SUM(IIF(TRT_2.[COLUMN]='5' ,NSUM,0)),0) AS "5",
ISNULL(SUM(IIF(TRT_2.[COLUMN]='6' ,NSUM,0)),0) AS "6"
FROM Data000 INNER JOIN TRT_2 ON Data000.C2ID01=TRT_2.C2ID01 AND Data000.C2ID18=TRT_2.C2ID18 AND Data000.IYEAR=@IYEAR AND Data000.IMONTH >=@PF and Data000.IMONTH<= @PT and Data000.C2ID10>=@COMP1 and Data000.C2ID10<=@COMP1 and Data000.CPARTNER>=@PCOMP1 and Data000.CPARTNER<=@PCOMP2 AND Data000.CPARTNER=TCPARTNER.CPARTNER )
FROM TCPARTNER GROUP BY TCPARTNER.CPARTNER

Пжт, помогите оптимизировать запрос
30 июн 15, 08:31    [17830989]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
SELECT TCPARTNER.CPARTNER, 
       SUM(CASE WHEN TRT_2.[COLUMN]='3' THEN NSUM ELSE 0 END)) AS "3"
       SUM(CASE WHEN TRT_2.[COLUMN]='4' THEN NSUM ELSE 0 END)) AS "4"
       SUM(CASE WHEN TRT_2.[COLUMN]='5' THEN NSUM ELSE 0 END)) AS "5"
       SUM(CASE WHEN TRT_2.[COLUMN]='6' THEN NSUM ELSE 0 END)) AS "6"
FROM Data000, TRT_2, TCPARTNER
WHERE Data000.C2ID01=TRT_2.C2ID01 
  AND Data000.C2ID18=TRT_2.C2ID18 
  AND Data000.IYEAR=@IYEAR 
  AND Data000.IMONTH >=@PF 
  and Data000.IMONTH<= @PT 
  and Data000.C2ID10>=@COMP1 
  and Data000.C2ID10<=@COMP1 
  and Data000.CPARTNER>=@PCOMP1 
  and Data000.CPARTNER<=@PCOMP2 
  AND Data000.CPARTNER=TCPARTNER.CPARTNER 
GROUP BY TCPARTNER.CPARTNER

?
30 июн 15, 08:55    [17831029]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
И даже так:
SELECT TCPARTNER.CPARTNER, 
       SUM(CASE WHEN TRT_2.[COLUMN]='3' THEN NSUM ELSE 0 END)) AS "3"
       SUM(CASE WHEN TRT_2.[COLUMN]='4' THEN NSUM ELSE 0 END)) AS "4"
       SUM(CASE WHEN TRT_2.[COLUMN]='5' THEN NSUM ELSE 0 END)) AS "5"
       SUM(CASE WHEN TRT_2.[COLUMN]='6' THEN NSUM ELSE 0 END)) AS "6"
FROM Data000, TRT_2, TCPARTNER
WHERE Data000.C2ID01=TRT_2.C2ID01 
  AND Data000.C2ID18=TRT_2.C2ID18 
  AND Data000.IYEAR=@IYEAR 
  AND Data000.IMONTH >=@PF 
  and Data000.IMONTH<= @PT 
  and Data000.C2ID10>=@COMP1 
  and Data000.C2ID10<=@COMP1 
  and TCPARTNER.CPARTNER>=@PCOMP1 
  and TCPARTNER.CPARTNER<=@PCOMP2 
  AND Data000.CPARTNER=TCPARTNER.CPARTNER 
GROUP BY TCPARTNER.CPARTNER
30 июн 15, 08:57    [17831030]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Tosya_78
Member

Откуда:
Сообщений: 9
Akina, спасибо за ответ!

Но мне нужно чтобы в строках отображались все данные из таблицы TCPARTNER

Когда Ваш запрос выполняется в строках отображаются данные из таблицы Data000.
30 июн 15, 09:06    [17831044]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
Akina,

left join ?
30 июн 15, 09:10    [17831056]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Tosya_78
Member

Откуда:
Сообщений: 9
выходит такая ошибка

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
30 июн 15, 09:26    [17831094]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Tosya_78, имеется в виду, вот так переписать:

SELECT TCPARTNER.CPARTNER, 
       SUM(CASE WHEN TRT_2.[COLUMN]='3' THEN NSUM ELSE 0 END)) AS "3"
       SUM(CASE WHEN TRT_2.[COLUMN]='4' THEN NSUM ELSE 0 END)) AS "4"
       SUM(CASE WHEN TRT_2.[COLUMN]='5' THEN NSUM ELSE 0 END)) AS "5"
       SUM(CASE WHEN TRT_2.[COLUMN]='6' THEN NSUM ELSE 0 END)) AS "6"
FROM TCPARTNER
         left join Data000
                 on Data000.CPARTNER=TCPARTNER.CPARTNER
                 AND Data000.IYEAR=@IYEAR 
                 AND Data000.IMONTH >=@PF 
                 and Data000.IMONTH<= @PT 
                 and Data000.C2ID10>=@COMP1 
                 and Data000.C2ID10<=@COMP1 
         left join TRT_2
                on Data000.C2ID01=TRT_2.C2ID01 
                AND Data000.C2ID18=TRT_2.C2ID18 
where TCPARTNER.CPARTNER>=@PCOMP1 
   and TCPARTNER.CPARTNER<=@PCOMP2 
GROUP BY TCPARTNER.CPARTNER
30 июн 15, 09:29    [17831105]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Tosya_78
Member

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

В строках отобразились все данные из таблицы TCPARTNER, но суммы удвоились ((
30 июн 15, 09:37    [17831127]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Tosya_78, в TCPARTNER у вас дубли? Тогда можно так попробовать

SELECT TCPARTNER.CPARTNER, 
       SUM(CASE WHEN TRT_2.[COLUMN]='3' THEN NSUM ELSE 0 END)) AS "3"
       SUM(CASE WHEN TRT_2.[COLUMN]='4' THEN NSUM ELSE 0 END)) AS "4"
       SUM(CASE WHEN TRT_2.[COLUMN]='5' THEN NSUM ELSE 0 END)) AS "5"
       SUM(CASE WHEN TRT_2.[COLUMN]='6' THEN NSUM ELSE 0 END)) AS "6"
FROM (select distinct CPARTNER from TCPARTNER 
          where  TCPARTNER.CPARTNER>=@PCOMP1 
             and TCPARTNER.CPARTNER<=@PCOMP2) as TCPARTNER
         left join Data000
                 on Data000.CPARTNER=TCPARTNER.CPARTNER
                 AND Data000.IYEAR=@IYEAR 
                 AND Data000.IMONTH >=@PF 
                 and Data000.IMONTH<= @PT 
                 and Data000.C2ID10>=@COMP1 
                 and Data000.C2ID10<=@COMP1 
         left join TRT_2
                on Data000.C2ID01=TRT_2.C2ID01 
                AND Data000.C2ID18=TRT_2.C2ID18 
GROUP BY TCPARTNER.CPARTNER
30 июн 15, 10:02    [17831223]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Tosya_78
Member

Откуда:
Сообщений: 9
Minamoto, спасибо!!!

Получилась!!!
30 июн 15, 10:45    [17831443]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить