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

Откуда:
Сообщений: 2
Прошу помочь отредактировать запрос, а то каждый вложенный запрос повторяет одно и тоже - дату и и смену. Как их задать один раз?

SET DATEFORMAT ymd 
SELECT rasxPG as rasxPG_1,
            davlGD AS davlGD_1, 
            davlGrD AS davlGrD_1, 
            tempGD AS tempGD_1,
            rasxvozd AS rasxvozd_1, 
            rasxHDskor AS rasxHDskor_1, 
            tempHD AS tempHD_1, 
            (davlGD-davlGrD) AS dP_1 
FROM 
        (SELECT TOP (1) (SELECT SUM(rasxPG) FROM [dbo].[Regim] as ttb WHERE Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1)  as rasxPG, 
                                 (SELECT AVG(davlGD) FROM [dbo].[Regim] as ttb WHERE ttb.rasxHDpr >10 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1)  as davlGD, 
                                 (SELECT AVG(davlGrD) FROM [dbo].[Regim] as ttb WHERE ttb.rasxHDpr >10 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1) as davlGrD, 
                                 (SELECT AVG(tempGD) FROM [dbo].[Regim] as ttb  WHERE ttb.tempGD >10 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1) as tempGD, 
                                 (SELECT AVG(rasxvozd) FROM [dbo].[Regim] as ttb WHERE ttb.rasxvozd >10 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1) as rasxvozd,
                                 (SELECT AVG(rasxHDskor) FROM [dbo].[Regim] as ttb WHERE ttb.rasxHDskor >10 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1) as rasxHDskor ,
                                 (SELECT AVG(tempHD) FROM [dbo].[Regim] as ttb  WHERE ttb.tempHD >5 and Data = '2016-04-27' and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1) as tempHD 
        FROM 
                (SELECT *, DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1 AS smena FROM [dbo].[Regim]  WHERE Data = '2016-04-27') AS TB WHERE smena = 1) as tb2
 
 
28 апр 16, 00:41    [19115271]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
Добрый Э - Эх
Guest
Dgil,

вся твоя портянка с подзапросами в select-листе должна быть перенесена в виде одного derived-table в секцию FROM.
разнесение данных с доп.условиями фильтрации по колонкам сделать посредством CASE.

единственное, что непонятно - почему ты в основной секции данные из Regim ограничиваешь только первой сменой (smena = 1), а в подзапросах считаешь агрегаты без привязки к смене???
28 апр 16, 05:33    [19115426]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Добрый Э - Эх,

там тоже первая смена
and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1
28 апр 16, 07:36    [19115494]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
Добрый Э - Эх
Guest
LexusR,

точно. кривое форматирование замыливает взгляд... счас под себя отформатировал и всё увидел сам...
28 апр 16, 07:48    [19115512]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
iljy
Member

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

вообще вот это вот условие

(DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1


совершенно чудовищно: такой вид условия убивает даже теоретическую возможность использования индекса. И потом, если Data - это просто дата, то нафига ее добавлять при получении часа? И типы полей какие? Строки?
28 апр 16, 08:00    [19115532]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
Добрый Э - Эх
Guest
Dgil,

возможно, что должно быть что-то типа такого:

SELECT rasxPG     as rasxPG_1,
       davlGD     AS davlGD_1, 
       davlGrD    AS davlGrD_1, 
       tempGD     AS tempGD_1,
       rasxvozd   AS rasxvozd_1, 
       rasxHDskor AS rasxHDskor_1, 
       tempHD     AS tempHD_1, 
       (davlGD-davlGrD) AS dP_1 
  FROM (
         SELECT SUM(rasxPG) as rasxPG, 
                AVG(case when   ttb.rasxHDpr > 10 then     davlGD else null end) as davlGD, 
                AVG(case when   ttb.rasxHDpr > 10 then    davlGrD else null end) as davlGrD, 
                AVG(case when     ttb.tempGD > 10 then     tempGD else null end) as tempGD, 
                AVG(case when   ttb.rasxvozd > 10 then   rasxvozd else null end) as rasxvozd,
                AVG(case when ttb.rasxHDskor > 10 then rasxHDskor else null end) as rasxHDskor,
                AVG(case when     ttb.tempHD >  5 then     tempHD else null end) as tempHD 
           FROM [dbo].[Regim] ttb
          WHERE ttb.Data = '2016-04-27' 
            and (DATEPART(hh, Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1
       ) as tb2
28 апр 16, 08:00    [19115534]     Ответить | Цитировать Сообщить модератору
 Re: необходимо отредактировать запрос  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх,

а если оно так, то надобность в подзапросе и вовсе теряется. всё можно написать в "линейном" виде:
SELECT SUM(rasxPG) as rasxPG, 
       AVG(case when   ttb.rasxHDpr > 10 then     ttb.davlGD else null end) as davlGD, 
       AVG(case when   ttb.rasxHDpr > 10 then    ttb.davlGrD else null end) as davlGrD, 
       AVG(case when     ttb.tempGD > 10 then     ttb.tempGD else null end) as tempGD, 
       AVG(case when   ttb.rasxvozd > 10 then   ttb.rasxvozd else null end) as rasxvozd,
       AVG(case when ttb.rasxHDskor > 10 then ttb.rasxHDskor else null end) as rasxHDskor,
       AVG(case when     ttb.tempHD >  5 then     ttb.tempHD else null end) as tempHD,
       AVG(case when   ttb.rasxHDpr > 10 then     ttb.davlGD else null end) -
       AVG(case when   ttb.rasxHDpr > 10 then    ttb.davlGrD else null end) as dP
  FROM [dbo].[Regim] ttb
 WHERE ttb.Data = '2016-04-27' 
   and (DATEPART(hh, ttb.Data + Vremya + 2 + '00:00:00') / 8 + 1) = 1
28 апр 16, 08:39    [19115600]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить