Я как бы застрял в одном из 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 строку для каждого заказа, но Мне нужна только одна строка за заказ.
Как исправить ошибку? Я просто смущен !!
Спасибо!
Вы пробовали переписывать запрос, чтобы устранить необходимость в коррелированном запросе? –
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
И D.DT_START> = MIN (J.DT_JOB_ST) И D.DT_END <= MAX (J.DT_JOB_ED)) работал! .. Благодаря тонну . . Как я могу дать вам баллы? –