Использование функции преобразования в операторе case SQL Server - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать запрос SQL для создания отчета из моей базы данных.

Каждые пять или более минут в мою БД добавляется новая запись, длина этой записи - время, которое она прошла, и сдвиг, когда она была сделана.

Ранее имел этот код:

SELECT 
    SUM(DataEntry.Length) AS Length, 
    COUNT(DISTINCT MicrotecDataEntry.DateTime) AS NumberTimeEntry, 
    Shift,
    CONVERT(DATE, DATEADD(mi, -360, DateTime)) AS Expr1
FROM            
    DataEntry 
WHERE       
    (DateTime > DATEADD(d, - 28, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE()))))))  
    AND (DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE()))))))
GROUP BY  Shift, 
    CONVERT(date, DATEADD(mi, - 360, MicrotecDataEntry.DateTime))

Наша ночная смена работает в два разных дня, поэтому, чтобы сохранить ее в один рабочий день, мы убираем 6 часов с этой даты, поэтому ночная смена начинается в 00:00 AM с этого дня.

Но теперь по некоторым причинам я должен убрать 12 часов для ночной смены и 6 часов для других смен. Поэтому я хотел бы сделать что-то вроде:

SELECT 
    SUM(ataEntry.Length) AS Length, 
    COUNT(DISTINCT DateTime) AS NumberTimeEntry, 
    MicrotecTimeQuarter.Shift, 
    CASE  
       WHEN MicrotecTimeQuarter.Shift = 'shift 2'
          THEN CONVERT(DATE, DATEADD(mi, -720, DateTime))
          ELSE CONVERT(DATE, DATEADD(mi, -360, DateTime))
    END AS Expr1
FROM    
   DataEntry 
MicrotecTimeQuarter.Id
WHERE  
    (DateTime > DATEADD(d, - 7, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
    AND (DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 

GROUP BY Shift, 
    CASE  
       WHEN Shift = 'shift 2'
          THEN CONVERT(DATE, DATEADD(mi, -720, DateTime))
          ELSE CONVERT(DATE, DATEADD(mi, -360, DateTime))
   END 

Но, похоже, синтаксис неправильный, и я получаю сообщение

MicrotechDataEntry.DateTime недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY

Я новичок в SQL, поэтому не знаю, в чем проблема. Есть ли у вас идеи о том, что вызывает проблему и как я могу ее решить? Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Вы не можете использовать поле DateTime в своем заявлении, так как оно не является частью группировки. Одним из решений является получение вычисленного поля в подзапросе и группы на более высоком уровне.

SELECT
    SUM(X.Length) AS Length, 
    COUNT(DISTINCT MDE.DateTime) AS NumberTimeEntry, 
    MTQ.Shift, 
    Expr1
FROM
(
    SELECT
        MDE.DateTime,
        MDE.Length,
        MQT.Shift,
        Expr1 = CASE WHEN MTQ.Shift='shift 2'then    CONVERT(date, DATEADD(MINUTE, -    720, MDE.DateTime)) ELSE CONVERT(date, DATEADD(MINUTE, - 360, MDE.DateTime)) END 
    FROM
        MicrotecDataEntry MDE 
        INNER JOIN MicrotecTimeQuarter MTQ ON MDE.MicrotecTimeQuarterId = MTQ.Id
    WHERE
        (MDE.DateTime > DATEADD(d, - 7, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
        AND 
        (MDE.DateTime < DATEADD(d, - 0, DATEADD(mi, 390, CONVERT(datetime, CONVERT(date, DATEADD(mi, - 390, GETDATE())))))) 
        AND 
        (MDE.MicrotecProductId <> 4)
)AS X
GROUP BY
    Shift,
    Expr1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...