2015-06-08 3 views
10

У меня есть эта таблицаКак SUM() каждой строки в другую колонку

| ID_prim | ID (FKey) | Date   | Moved Items | 
|:-----------|:------------|-------------:|:------------:| 
| 1003  | 12_1  | nov 2013 | 2   | 
| 1003  | 12_2  | okt 2013 | 3   | 
| 1003  | 12_3  | dec 2014 | 5   | 
| 1003  | 12_4  | feb 2015 | 10  | 
| 1003  | 12_5  | apr 2012 | 1   | 
| 1003  | 12_11  | jan 2011 | 5   | 

Я хочу запросить ту же таблицу следующим образом:

  1. Заказ даты по алфавиту
  2. Сумма каждого «Перемещенный элемент» в строке
  3. Остановите запрос, если сумма достигает моей нужной суммы
  4. Желаемая сумма начинается с MAX 'Summed Total '(26) и вычитает сумму я хочу (16)

как так

| ID_prim | ID (FKey) | Date   | Moved Items | Summed Total | 
|:-----------|:------------|-------------:|:------------:|:------------:| 
| 1003  | 12_4  | feb 2015 |  10  |  26 
| 1003  | 12_3  | dec 2014 |  5  |  16 
| 1003  | 12_3  | nov 2013 |  2  |  11 < 
| 1003  | 12_4  | okt 2013 |  3  |  9 
| 1003  | 12_5  | apr 2012 |  1  |  6 
| 1003  | 12_11  | jan 2011 |  5  |  5 

Я хочу, чтобы остановить запрос, когда я достичь "суммированием всего" (26) - 16 = 10. Таким образом, Покажите мне все от 10> Я бы только получил эти значения в базе данных.

| ID_prim | ID (FKey) | Date   | Moved Items | Summed Total | 
|:-----------|:------------|-------------:|:------------:|:------------:| 
| 1003  | 12_4  | feb 2015 |  10  |  26 
| 1003  | 12_3  | dec 2014 |  5  |  16 
| 1003  | 12_3  | nov 2013 |  2  |  11 

Что у меня есть следующие

SELECT 
    T1.ID_prim, T1.ID as ID (FKey), T1.Moved_Items as Moved Items, t1.Date, SUM(T2.MOVEMENTQTY) AS Summed Total 
    FROM Table1 T1 
    INNER JOIN Table1 T2 ON T2.ID <= T1.ID 
    inner join table2 inout on T1.ID_prim = inout.ID_prim 
    AND T2.ID_prim = inout.ID_prim 
    AND T2.ID_prim = T1.ID_prim 
    where t1.ID_prim = 1003 
    and t2.ID_prim = 1003 
    and inout.ISSOTRX = 'N' 
    GROUP BY T1.ID_prim, T1.Moved Items, t1.Date 
    HAVING SUM(T2.Moved Items) <= 16 
    order by t1.UPDATED desc 

Но сумма реально не работает. Может ли кто-нибудь помочь мне сделать инструкцию SQL для базы данных Oracle, которая будет печатать мою желаемую таблицу?

+0

'nov 2013 'НЕ ** ** DATE **. Просьба предоставить некоторые примеры данных, используя 'to_date' для значений даты. –

+0

@LalitKumarB Я не писал дату выше. В DB мой столбец даты выглядит так: «2015-06-08 11:52:00», и это значение DATE. Но это не основное внимание здесь. Основное внимание уделяется суммированному итогу и как итерации – Igoranze

+0

. Не должна ли общая сумма быть '27', а не' 26'? –

ответ

4

на основе уточнений Op с помощью комментариев по этому вопросу, это может быть сделано с помощью SUM() аналитической функции, чтобы получить работает полный, а затем фильтровать на основании состояния.

Таблица:

SQL> SELECT * FROM t; 

    ID_PRIM ID DT    MOVED 
---------- ----- --------- ---------- 
     1003 12_1 01-NOV-13   2 
     1003 12_2 01-OCT-13   3 
     1003 12_3 01-DEC-14   5 
     1003 12_4 01-FEB-15   10 
     1003 12_5 01-APR-12   1 
     1003 12_11 01-JAN-11   5 

6 rows selected. 

SQL> 

Запуск общей

SQL> SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 
     1003 12_1 01-NOV-13   2   11 
     1003 12_2 01-OCT-13   3   9 
     1003 12_5 01-APR-12   1   6 
     1003 12_11 01-JAN-11   5   5 

6 rows selected. 

SQL> 

Желаемая выход

SQL> WITH DATA AS 
    2 (SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC 
    3 ) 
    4 SELECT * FROM data WHERE sm >= 16; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 

SQL> 

Пожалуйста, обратите внимание, что, nov 2013 - это не дата, это строка. Поскольку вы хотите сортировать по дате, вы всегда должны использовать TO_DATE, чтобы его явным образом преобразовать в date. Во всяком случае, я использовал TO_DATE для создания выборочных данных.

Update OP хочет, чтобы вычесть его желаемое значение из значения MAX из суммированных значений во время выполнения.

SQL> WITH DATA AS 
    2 (SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC 
    3 ) 
    4 SELECT * FROM DATA t WHERE sm > 
    5 (SELECT MAX(sm) FROM data 
    6 ) - 16 ; 

    ID_PRIM ID DT    MOVED   SM 
---------- ----- --------- ---------- ---------- 
     1003 12_4 01-FEB-15   10   26 
     1003 12_3 01-DEC-14   5   16 
     1003 12_1 01-NOV-13   2   11 

SQL> 

В обновленном запросе, MAX (см) возвращает 26, а затем строки фильтруются при условии WHERE sm > MAX(sm) -16 что означает возвращать все строки, где значение «см» больше 26 -16 т.е. 10.Вы можете использовать переменную замещения для ввода значения 16 во время выполнения.

+0

Закрыть, но я не хочу начинать с 0, а затем подсчитывать и проверять, откуда начинается my> = 16. Я хочу сначала подсчитать их все, как в таблице «Запуск всего», а затем из максимального значения (26) вычесть мое искомое значение (16). Что произойдет, если добавится еще одна строка над ID_PRIM ID DT MOVED SM ---------- ---- ---------- -------- - ---------- 1003 12_9 02-FEB-15 10 36 1003 12_4 01-FEB-15 10 26 тогда мой «Желаемый результат» также покажет последнее добавленное значение. Где я тогда хочу начать с MAX (36) и вычесть – Igoranze

+0

@Igoranze Хорошо, см. Мое обновление. В обновленном запросе MAX (sm) возвращает 26, а затем строки фильтруются по условию WHERE sm> MAX (sm) -16, что означает возврат всех строк, где значение «sm» больше 26 -16, т. Е. 10 . Вы можете использовать переменную замещения для ввода значения 16 во время выполнения. –

+0

Спасибо, чувак, работал! – Igoranze

Смежные вопросы