programing

각 행을 다른 열에 SUM()하는 방법

oldcodes 2023. 10. 26. 21:41
반응형

각 행을 다른 열에 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 '합계'부터 시작해서 내가 원하는 금액을 뺀 금액(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

"Summed Total" (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

하지만 그 금액은 별로 효과가 없어요.원하는 테이블을 인쇄할 Oracle DB용 SQL 문을 만드는 것을 도와줄 수 있는 사람?

질문에 대한 의견을 통해 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를 사용하여 명시적으로 날짜로 변환해야 합니다.어쨌든 저는 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(sm)가 반환됩니다.26, 그런 다음 행은 조건에 따라 필터링됩니다.WHERE sm > MAX(sm) -16즉, 'sm' 값이 다음보다 큰 모든 행을 반환합니다.26 -16예.10. 대체 변수를 사용하여 값을 입력할 수 있습니다.16런 타임에

언급URL : https://stackoverflow.com/questions/30705878/how-to-sum-each-row-into-another-column

반응형