簡體   English   中英

Oracle SQL組總和

[英]Oracle sql group sum

我有ID,Sub_ID和值列的表

ID  SUB_ID  Value
100 1   100
100 2   150
101 1   100
101 2   150
101 3   200
102 1   100

SUB ID可以從1..maxvalue(在此示例中為3)變化。 我需要每個Sub_ID的值總和。 如果SUB_ID小於特定ID的MAXVALUE,則應采用每個ID的MAX(SUB_ID),如下所示(在此示例中,對於SUB_ID 3,ID = 100,它應采用150,即2 <3,因此值= 150))

SUB_ID  SUM(values) Remarks
1           300         (100+100+100)
2           400         (150+150+100)
3           450         (150+200+100)

這可以在PL / SQL中輕松完成。 我們可以使用Model子句或任何其他選項將SQL用作同一對象嗎

SQL小提琴

Oracle 11g R2架構設置

CREATE TABLE TableA ( ID, SUB_ID, Value ) AS
          SELECT 100, 1, 100 FROM DUAL
UNION ALL SELECT 100, 2, 150 FROM DUAL
UNION ALL SELECT 101, 1, 100 FROM DUAL
UNION ALL SELECT 101, 2, 150 FROM DUAL
UNION ALL SELECT 101, 3, 200 FROM DUAL
UNION ALL SELECT 102, 1, 100 FROM DUAL

查詢1

WITH sub_ids AS (
  SELECT LEVEL AS sub_id
  FROM   DUAL
  CONNECT BY LEVEL <= ( SELECT MAX( SUB_ID ) FROM TableA )
),
max_values AS (
  SELECT ID,
         MAX( VALUE ) AS max_value
  FROM   TableA
  GROUP BY ID
)
SELECT s.SUB_ID,
       SUM( COALESCE( a.VALUE, m.max_value ) ) AS total_value
FROM   sub_ids s
       CROSS JOIN
       max_values m
       LEFT OUTER JOIN
       TableA a
       ON ( s.SUB_ID = a.SUB_ID AND m.ID = a.ID )
GROUP BY
       s.SUB_ID

結果

| SUB_ID | TOTAL_VALUE |
|--------|-------------|
|      1 |         300 |
|      2 |         400 |
|      3 |         450 |

嘗試這個

SELECT SUB_ID,SUM(values),
 (SELECT DISTINCT SUBSTRING(   
(   
SELECT '+'+ CAST(values AS VARCHAR)
  FROM table_Name  AS T2  
WHERE T2.SUB_ID = d.SUB_ID        
 FOR XML PATH ('') 
),2,100000)[values]) as values  
FROm table_Name d
GROUP BY SUB_ID

這樣的事情怎么樣:

select max_vals.sub_id, sum(nvl(table_vals.value,max_vals.max_value)) as sum_values
from (
    select all_subs.sub_id, t1.id, max(t1.value) as max_value
    from your_table t1
    cross join (select sub_id from your_table) all_subs
    group by all_subs.sub_id, t1.id
) max_vals
left outer join your_table table_vals
on max_vals.id = table_vals.id
and max_vals.sub_id = table_vals.sub_id
group by max_vals.sub_id;

內部查詢為您提供所有sub_id / id組合及其后備值的列表。 out查詢使用nvl使用表值(如果存在),並使用后備值(如果不存在)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM