Сводные данные в базе данных Oracle - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в программировании SQL.Я хотел бы сделать резюме в Oracle Database, но я не нашел, как это сделать.Я просто делаю запрос следующим образом:

SELECT 
    T1.LINE_CD  
  , T1.ITM_CD
  , T1.INST_NO
  , T1.PROD_SCHD_QTY
  , NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0)AS PROD_SHIFT1
  , NVL(DECODE(T1.SHIFT,2,T1.PROD_RESULT),0)AS PROD_SHIFT2
  , NVL(DECODE(T1.SHIFT,3,T1.PROD_RESULT),0)AS PROD_SHIFT3
  , NVL(SUM(T3.PROD_RESULT),0) AS TOTAL_PRODUCTION
  , NVL(DECODE(T1.SHIFT,1,T1.TF_FG),0)AS TRANS_SHIFT1
  , NVL(DECODE(T1.SHIFT,2,T1.TF_FG),0)AS TRANS_SHIFT2
  , NVL(DECODE(T1.SHIFT,3,T1.TF_FG),0)AS TRANS_SHIFT3
  , NVL(SUM(T3.TF_FG),0) AS TOTAL_TRANSFER

FROM TMCI_IM_PROD T1 INNER JOIN CM_HINMO_ALL T2
ON T1.ITM_CD=T2.ITM_CD
LEFT JOIN
TMCI_IM_PROD T3
ON T1.INST_NO=T3.INST_NO
WHERE 0=0 AND
T1.INST_NO = 'M181101666' AND
T1.INS_TS BETWEEN TO_DATE(:qDT_FROM, 'DDMMYYYY HH24:MI:SS') AND TO_DATE(:qDT_TO, 'DDMMYYYY HH24:MI:SS') AND
T3.INS_TS BETWEEN TO_DATE(:qDT_FROM, 'DDMMYYYY HH24:MI:SS') AND TO_DATE(:qDT_TO, 'DDMMYYYY HH24:MI:SS')

GROUP BY 
    T1.ITM_CD, 
    T1.INST_NO,
    T1.SHIFT,
    T1.PROD_RESULT,
    T1.LINE_CD, 
    T1.PROD_SCHD_QTY, 
    T1.TF_FG,
    T1.INS_TS
ORDER BY T1.INS_TS ASC

И результат этого запроса будет выглядеть следующим образом;enter image description here Может ли кто-нибудь здесь помочь мне найти способы, как это сделать.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вам нужно немного переработать запрос, чтобы сгруппировать результаты.Любой неуникальный столбец должен быть внутри групповой функции.

  1. Использовать групповую функцию вокруг любого столбца, где вы хотите получить суммарные значения
  2. Исключить любой столбец внутри вашей групповой функции из предложения de group by1006 *

и попробуйте снова:

SELECT 
  T1.LINE_CD  
, T1.ITM_CD
, T1.INST_NO
, T1.PROD_SCHD_QTY
, SUM(NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0)) AS PROD_SHIFT1
, SUM(NVL(DECODE(T1.SHIFT,2,T1.PROD_RESULT),0)) AS PROD_SHIFT2
, SUM(NVL(DECODE(T1.SHIFT,3,T1.PROD_RESULT),0)) AS PROD_SHIFT3
, SUM(NVL(DECODE(T1.SHIFT,1,T1.TF_FG),0)) AS TRANS_SHIFT1
, SUM(NVL(DECODE(T1.SHIFT,2,T1.TF_FG),0)) AS TRANS_SHIFT2
, SUM(NVL(DECODE(T1.SHIFT,3,T1.TF_FG),0)) AS TRANS_SHIFT3
, SUM(NVL(T1.PROD_RESULT,0)) AS TOTAL_PRODUCTION
, SUM(NVL(T1.TF_FG,0)) AS TOTAL_TRANSFER
FROM TMCI_IM_PROD T1 
INNER JOIN CM_HINMO_ALL T2
ON T1.ITM_CD=T2.ITM_CD
WHERE 0=0 AND
T1.INST_NO = 'M181101666' AND
T1.INS_TS BETWEEN TO_DATE(:qDT_FROM, 'DDMMYYYY HH24:MI:SS') AND TO_DATE(:qDT_TO, 'DDMMYYYY HH24:MI:SS')
GROUP BY 
T1.ITM_CD, T1.INST_NO, T1.LINE_CD, PROD_SCHD_QTY, T1.INS_TS
ORDER BY T1.INS_TS ASC
0 голосов
/ 07 декабря 2018

Трудно ответить, не видя, не видя структуру ваших таблиц, однако вот несколько предположений:

  • несколько полей вывода построены из NVL/DECODE в одном поле(ы).Это побеждает агрегацию и может генерировать дубликаты.Либо удалите эту логику, либо скопируйте NVL/DECODE в предложение GROUP BY

  • У вас есть фильтр в поле, которое вы не отображаете, и вы, кажется, ожидаете одну строкутем не мение ;удалить этот бесполезный уровень агрегации

Вот запрос, который реализует вышеуказанные принципы:

SELECT 
    T1.LINE_CD,  
    T1.ITM_CD,
    T1.INST_NO,
    T1.PROD_SCHD_QTY,
    NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0)AS PROD_SHIFT1,
    NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0)AS PROD_SHIFT1,
    NVL(DECODE(T1.SHIFT,2,T1.PROD_RESULT),0)AS PROD_SHIFT2,
    NVL(DECODE(T1.SHIFT,3,T1.PROD_RESULT),0)AS PROD_SHIFT3,
    NVL(DECODE(T1.SHIFT,1,T1.TF_FG),0)AS TRANS_SHIFT1,
    NVL(DECODE(T1.SHIFT,2,T1.TF_FG),0)AS TRANS_SHIFT2,
    NVL(DECODE(T1.SHIFT,3,T1.TF_FG),0)AS TRANS_SHIFT3,
    NVL(SUM(T1.PROD_RESULT),0) AS TOTAL_PRODUCTION,
    NVL(SUM(T1.TF_FG),0) AS TOTAL_TRANSFER
FROM TMCI_IM_PROD T1 
    INNER JOIN CM_HINMO_ALL T2 ON T1.ITM_CD=T2.ITM_CD
WHERE 
    T1.INST_NO = 'M181101666' AND
    T1.INS_TS BETWEEN TO_DATE(:qDT_FROM, 'DDMMYYYY HH24:MI:SS') AND TO_DATE(:qDT_TO, 'DDMMYYYY HH24:MI:SS')
GROUP BY 
    T1.LINE_CD,
    T1.ITM_CD, 
    T1.INST_NO, 
    T1.SHIFT,
    T1.PROD_SCHD_QTY,
    NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0),
    NVL(DECODE(T1.SHIFT,1,T1.PROD_RESULT),0),
    NVL(DECODE(T1.SHIFT,2,T1.PROD_RESULT),0),
    NVL(DECODE(T1.SHIFT,3,T1.PROD_RESULT),0),
    NVL(DECODE(T1.SHIFT,1,T1.TF_FG),0),
    NVL(DECODE(T1.SHIFT,2,T1.TF_FG),0),
    NVL(DECODE(T1.SHIFT,3,T1.TF_FG),0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...