2015-06-08 15 views
10

Tôi có bảng nàyLàm thế nào để sum() mỗi hàng vào cột khác

| 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   | 

tôi muốn truy vấn cùng một bảng như sau:

  1. thứ tự các ngày bởi desc
  2. Sum mỗi 'Mục đã chuyển' trên mỗi hàng
  3. Dừng truy vấn nếu Số tiền đạt đến số tiền mong muốn của tôi
  4. Số tiền mong muốn của tôi bắt đầu từ MAX 'Tổng cộng được tổng cộng '(26) và trừ số tiền tôi muốn (16)

Giống như rất

| 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 

Tôi muốn ngừng truy vấn khi tôi đạt được "tóm tắt hoàn toàn" (26) - 16 = 10. Vì vậy, Chỉ cho tôi mọi thứ từ 10> Tôi sẽ chỉ nhận được các giá trị này trong cơ sở dữ liệu.

| 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 

Những gì tôi có là sau

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 

Nhưng tổng không thực sự làm việc. Bất cứ ai có thể giúp tôi ra để làm cho câu lệnh SQL cho Oracle DB sẽ in bảng Desired của tôi?

+0

'nov 2013' KHÔNG phải là ** NGÀY **. Vui lòng cung cấp một số dữ liệu mẫu sử dụng 'to_date' cho các giá trị ngày tháng. –

+0

@LalitKumarB Tôi không ghi ngày tháng ở trên. Trong cột ngày của tôi, DB trông như thế này "2015-06-08 11:52:00" và đó là giá trị DATE. Nhưng đó không phải là trọng tâm chính ở đây. Trọng tâm chính là Tổng số được Tổng và cách lặp lại – Igoranze

+0

Không phải tổng số tiền là '27' và không phải là' 26'? –

Trả lời

4

Dựa trên làm rõ OP của thông qua ý kiến ​​về vấn đề, nó có thể được thực hiện bằng SUM() chức năng phân tích để có được những chạy tổng, và sau đó lọc nó dựa trên điều kiện.

Bảng:

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> 

Chạy tổng

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> 

mong muốn đầu ra

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> 

Xin lưu ý rằng, nov 2013 không phải là ngày, nó là chuỗi. Vì bạn muốn sắp xếp trên cơ sở ngày, bạn phải luôn sử dụng TO_DATE để chuyển đổi rõ ràng thành ngày. Dù sao, tôi đã sử dụng TO_DATE để tạo dữ liệu mẫu.

Cập nhật OP muốn trừ giá trị mong muốn của mình khỏi giá trị tổng cộng của thời gian chạy là 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> 

Trong truy vấn cập nhật, MAX (sm) lợi nhuận 26, và sau đó các hàng được lọc với điều kiện WHERE sm > MAX(sm) -16 có nghĩa là trả lại tất cả các hàng trong đó giá trị 'sm' lớn hơn 26 -16 ví dụ 10.Bạn có thể sử dụng biến số thay thế để nhập giá trị 16 vào thời gian chạy.

+0

Đóng, nhưng tôi không muốn để bắt đầu từ 0 và sau đó đếm ngược và kiểm tra từ nơi tôi> = 16 bắt đầu. Tôi muốn đầu tiên đếm tất cả chúng như trong bảng 'Tổng chạy', và sau đó từ giá trị tối đa (26) trừ đi giá trị mong muốn của tôi (16). Điều gì sẽ xảy ra nếu một hàng khác sẽ được thêm vào phía trên ID_PRIM ID DT MOVED SM ---------- ----- --------- -------- - ---------- 1003 12_9 02-FEB-15 10 36 1003 12_4 01-FEB-15 10 26 thì "đầu ra mong muốn" của tôi sẽ hiển thị giá trị gia tăng cuối cùng. Khi đó tôi muốn bắt đầu từ MAX (36) và trừ đi – Igoranze

+0

@Igoranze Ok, xem cập nhật của tôi. Trong truy vấn được cập nhật, MAX (sm) trả về 26, và sau đó các hàng được lọc theo điều kiện WHERE sm> MAX (sm) -16 có nghĩa là trả về tất cả các hàng có giá trị 'sm' lớn hơn 26 -16 nghĩa là 10 Bạn có thể sử dụng biến thay thế để nhập giá trị 16 vào thời gian chạy. –

+0

Cảm ơn anh bạn, đã làm việc! – Igoranze

Các vấn đề liên quan