проблема с оператором MAX в коде t-sql

#sql #sql-server #tsql #sql-server-2008

#sql #sql-сервер #tsql #sql-server-2008

Вопрос:

Это код:

 Select BCPP.*
from ViewPBCPP   BCPP
inner join
( 
Select MBC.PC     PC
      ,MRT.Name   CT
      ,Max(dbo.CalcDatefromUTC(MBC.CreatedDate)) as LRDate
from TableBACC    MBC

inner join TableSC.RT   MRT
ON MBC.RTid = MRT.id
where MBC.Isdeleted = 'False'
and MBC.PC <> 'NULL'
Group by MBC.PC
        ,MRT.Name
) MBCR
ON BCPP.P_id = MBCR.PC
and BCPP.CreatedDate = MBCR.LRDate
and BCPP.CT = MBCR.CT
  

Now Max(dbo.CalcDatefromUTC(MBC.CreatedDate)) на самом деле является функцией

Приведенный выше запрос отлично работает с Max(dbo.CalcDatefromUTC(MBC.CreatedDate))

Теперь, когда я пишу

 Max(dbo.CalcDatefromUTC(MBC.CreatedDate))   Min(dbo.CalcDatefromUTC(MBC.CreatedDate))
  

Я вообще не могу извлечь какие-либо значения из этого запроса, написанного выше

Если я напишу просто

 (dbo.CalcDatefromUTC(MBC.CreatedDate))
  

он выдает ошибку, что он не содержит агрегатной функции или функции group by

Я действительно хочу этого

 (dbo.CalcDatefromUTC(MBC.CreatedDate))
  

чтобы я мог использовать все значения этой функции, а не только ее максимальные значения

Как я могу изменить этот код, написанный выше, для достижения моей цели??

Кто-нибудь??

Комментарии:

1. Вы имеете в виду использовать dbo.CalcDatefromUTC( MAX(MBC.CreatedDate)) ?

2. Я не хочу использовать MAX, поскольку MAX даст мне только последние значения дат из функции. Я хочу изменить это, чтобы я мог использовать все значения дат, вычисленные этой функцией, а не только последние или максимальные значения даты. Если я удалю Max, как написан код, я получу ошибку агрегированной функции или группы по функции

3. Тогда почему вы используете GROUP BY MBC.PC, MRT.Name ?

4. GROUP BY MBC.PC, MRT.Name, MBC.CreatedDate Вместо этого вы можете.

5. Это не очень полезно. Во-первых, вы используете CreatedDate while в полях, вероятно, хранятся даты и времени. AFAIK, SQL-server-2008 имеет DATE тип. Во-вторых, вы говорите, что функция вычисляет разницу (между началом и концом), но у нее есть только один параметр. Что такое начало и что такое конец?

Ответ №1:

Вы не можете иметь dbo.CalcDatefromUTC(MBC.CreatedDate) в SELECT списке, поскольку ни вы, ни вы не можете иметь MBC.CreatedDate , потому что его нет в GROUP BY списке.

У вас может быть MAX(MBC.CreatedDate) , потому что он использует агрегатную функцию (MAX) для столбца thta. Вы также можете иметь:

 dbo.CalcDatefromUTC(MAX(MBC.CreatedDate)) as LRDate
  

на самом деле это то же самое (хотя, возможно, немного быстрее), что и:

 MAX(dbo.CalcDatefromUTC(MBC.CreatedDate)) as LRDate
  

Из ваших комментариев я предполагаю, что вышесказанное не очень полезно. Возможно, группировка по MBC.CreatedDate — это то, что вы хотите:

 Select BCPP.*
from ViewPBCPP   BCPP
inner join
( 
Select MBC.PC     PC
      ,MRT.Name   CT
      ,dbo.CalcDatefromUTC(MBC.CreatedDate) as LRDate
from TableBACC    MBC

inner join TableSC.RT   MRT
ON MBC.RTid = MRT.id
where MBC.Isdeleted = 'False'
and MBC.PC <> 'NULL'
Group by MBC.PC
        ,MBC.CreatedDate                  --- added
        ,MRT.Name
) MBCR
ON BCPP.P_id = MBCR.PC
and BCPP.CreatedDate = MBCR.LRDate
and BCPP.CT = MBCR.CT
  

Комментарии:

1. Это означает, что у вас больше строк в результирующем наборе вложенных запросов, по одной строке для каждой отдельной (MBC.PC, MBC.CreatedDate, MRT.Name) комбинации. Итак, да, нет MBC.CreatedDate будет «потеряно» во время группировки. Совсем не уверен, что это то, чего вы хотите. Попробуйте.

2. Если вы сообщите нам, что делает эта dbo.CalcDatefromUTC() функция, мы можем получить представление о том, что делает запрос.

3. функция dbo.CalcDatefromUTC() вычисляет VDate как datetime между startVDate и endVDate. Он возвращает дату и время

4. функция dbo.CalcDatefromUTC() вычисляет VDate как дату-время между начальным и конечным периодом. Он возвращает дату и время