2017-02-09 3 views
-1

Я как бы застрял в одном из SQL-запросов, где мне понадобилась бы небольшая помощь.Группа по проблеме в Select Query в SQL

Структура таблицы выглядит следующим образом:

Таблица № 1: PROD_ORDER:

ID_PROD_ORDER(PK) 
1001     
1002    
1003 

Таблица # 2: JOB

ID_JOB | ID_PROD_ORDER(FK)|ID_ASSET | DT_START   | DT_END 
1   1001    8  2016/11/22 05:45:50 2016/11/24 13:13:14 
2   1001    8  some date    some date 
3   1002    9  some date    some date 
4   1002    9  some date    some date 
5   1003    8  some date    some date 
6   1001    8  some date    some date 

Таблица № 3: Confirmation

ID_CONFIRMATION | ID_JOB | QT_CONF | QT_SCRAP 

Таблица № 4: DOWNTIME

ID_DOWNTIME | DT_START | DT_END | ID_ORG_SUB_ASSET 

Теперь требование найти порядок и

  • Дата начала заказа (который будет Мин DT_START от JOB)
  • Дата окончания порядок (который будет Макс из DT_END от JOB)
  • сумма всех QT_CONF
  • сумма всех своих рабочих мест своих рабочих мест QT_SCRAP
  • простои из простои таблицы, где время простоя = Разница в секундах DT_START - DT_END

ID_ASSET, Start Date и End Date будут переданы в качестве параметров.

Я написал этот вопрос:

SELECT 
    PO.ID_PROD_ORDER, 
    J.ID_ORG_ASSET, 
    SUM(C.QT_CONF) AS "QT_CONF", 
    SUM(C.QT_SCRAP) AS "QT_SCRAP", 
    MIN(J.DT_JOB_ST) AS "START_DATE", 
    MAX(J.DT_JOB_ED) AS "END_DATE", 
    (SELECT SUM(datediff(ss, D.DT_START, D.DT_END)) AS "DOWNTIMESECONDS" 
    FROM DOWNTIME D 
    INNER JOIN SUB_ASSET SA ON D.ID_SUB_ASSET = SA.ID_SUB_ASSET 
    WHERE SA.ID_ASSET = [Param.3] AND D.DT_START >= J.DT_JOB_ST 
     AND D.DT_END <= J.DT_JOB_ED) 
FROM 
    PROD_ORDER PO 
INNER JOIN 
    JOB J ON PO.ID_PROD_ORDER = J.ID_PROD_ORDER 
      AND J.DT_JOB_ST >= '[Param.1]' 
      AND J.DT_JOB_ED <= '[Param.2]' 
LEFT OUTER JOIN 
    CONFIRMATION C ON C.ID_JOB = J.ID_JOB 
WHERE 
    J.ID_ASSET = [Param.3] 
GROUP BY 
    PO.ID_PROD_ORDER, J.ID_ASSET 

Запрос выдает ошибку:

JOB.DT_JOB_ST cannot be included in select list as it is not used in aggregation or GROUP BY

Если я ставлю JOB.DT_JOB_ST и JOB.DT_JOB_ED в GROUP BY, то он возвращает более чем на 1 строку для каждого заказа, но Мне нужна только одна строка за заказ.

Как исправить ошибку? Я просто смущен !!

Спасибо!

+0

Вы пробовали переписывать запрос, чтобы устранить необходимость в коррелированном запросе? –

+0

Try 'AND D.DT_START> = MIN (J.DT_JOB_ST) И D.DT_END <= MAX (J.DT_JOB_ED))'. Btw, вы используете 'J.ID_ORG_ASSET' в' SELECT', но 'J.ID_ASSET' в' GROUP', это также должно завершиться неудачей. – dnoeth

+0

И D.DT_START> = MIN (J.DT_JOB_ST) И D.DT_END <= MAX (J.DT_JOB_ED)) работал! .. Благодаря тонну . . Как я могу дать вам баллы? –

ответ

0

Выполнен следующий запрос:

SELECT 
    PO.ID_PROD_ORDER, 
    J.ID_ASSET, 
    SUM(C.QT_CONF) AS "QT_CONF", 
    SUM(C.QT_SCRAP) AS "QT_SCRAP", 
    MIN(J.DT_JOB_ST) AS "START_DATE", 
    MAX(J.DT_JOB_ED) AS "END_DATE", 
    (SELECT SUM(datediff(ss, D.DT_START, D.DT_END)) AS "DOWNTIMESECONDS" 
    FROM DOWNTIME D 
    INNER JOIN SUB_ASSET SA ON D.ID_SUB_ASSET = SA.ID_SUB_ASSET 
    WHERE SA.ID_ASSET = [Param.3] AND D.DT_START >= MIN(J.DT_JOB_ST) 
     AND D.DT_END <= MAX(J.DT_JOB_ED)) 
FROM 
    PROD_ORDER PO 
INNER JOIN 
    JOB J ON PO.ID_PROD_ORDER = J.ID_PROD_ORDER 
      AND J.DT_JOB_ST >= '[Param.1]' 
      AND J.DT_JOB_ED <= '[Param.2]' 
LEFT OUTER JOIN 
    CONFIRMATION C ON C.ID_JOB = J.ID_JOB 
WHERE 
    J.ID_ASSET = [Param.3] 
GROUP BY 
    PO.ID_PROD_ORDER, J.ID_ASSET 
1

Я подозреваю, что проблема заключается в коррелированном запросе, который будет пытаться оценить для каждой строки - так как это включает в себя и DT_JOB_ED, для этого они должны быть частью группы.

Другой вариант должен был бы переписать не нужно коррелировать запрос, так что-то подобное должно быть хорошо для вас:

SELECT  PO.ID_PROD_ORDER, 
      J.ID_ORG_ASSET, 
      SUM(C.QT_CONF) AS [QT_CONF], 
      SUM(C.QT_SCRAP) AS [QT_SCRAP], 
      MIN(J.DT_JOB_ST) AS [START_DATE], 
      MAX(J.DT_JOB_ED) AS [END_DATE], 
      SUM(ISNULL(datediff(ss, D.DT_START, D.DT_END),0)) AS [DOWNTIMESECONDS] 

FROM  PROD_ORDER PO 

INNER JOIN JOB J 
    ON  PO.ID_PROD_ORDER = J.ID_PROD_ORDER 
    AND  J.DT_JOB_ST >= '[Param.1]' 
    AND  J.DT_JOB_ED <= '[Param.2]' 

LEFT JOIN CONFIRMATION C 
    ON  C.ID_JOB = J.ID_JOB 

LEFT JOIN DOWNTIME D 
    INNER JOIN SUB_ASSET SA 
     ON  D.ID_SUB_ASSET = SA.ID_SUB_ASSET 
     AND  SA.ID_ASSET = [Param.3] 
    ON  D.DT_START >= J.DT_JOB_ST 
    AND  D.DT_END <= J.DT_JOB_ED 

WHERE  J.ID_ASSET = [Param.3] 

GROUP BY PO.ID_PROD_ORDER, J.ID_ORG_ASSET 

(если вы предпочитаете, КТР может работать тоже)

+0

Это не дает правильного вывода. Кажется, этот запрос вычисляет SUM (C.QT_CONF), SUM (C.QT_SCRAP) и SUM времени простоя всех возможных записей (которые не должны включаться) и дает очень большое число. –