Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sql组和_Sql_Oracle_Oracle11g - Fatal编程技术网

Oracle sql组和

Oracle sql组和,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个带有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 子ID可以在1..maxvalue之间变化(在本例中为3)。我需要每个Sub_ID的值之和。如果Sub_ID小于particlaur ID的MAXVALUE,那么它应该取每个ID的MAX(Sub_ID),如下所示(在这个例子中,Sub_ID 3的ID=100,它应该取150,

我有一个带有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
子ID可以在1..maxvalue之间变化(在本例中为3)。我需要每个Sub_ID的值之和。如果Sub_ID小于particlaur ID的MAXVALUE,那么它应该取每个ID的MAX(Sub_ID),如下所示(在这个例子中,Sub_ID 3的ID=100,它应该取150,即2试试这个

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

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
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 |
查询1

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

内部查询为您获取所有子_id/id组合及其回退值的列表。外部查询使用
nvl
来使用表值(如果存在)和回退值(如果不存在)。

您可以扩展上面的数据集吗?您的文本指示存在id=100和子_id=3,但是该组合在表中不存在data set.SUB_ID=3是enitire表的最大SUB_ID。对于ID=100,这不存在。所以它应该取最大SUB_ID的值为100。所以它应该取150。对于102,它应该取100。是否只有3个SUB_ID?另外,您是否可以发布执行此逻辑的pl/sql?您是否可以将示例更新为仅不同的值,以便我能够理解ich 100您指的是。我们无法理解您的问题,请在问题中详细说明OP声明
SUB\u ID
s范围从
1…MAX
-如果所有
ID
都缺少
SUB\u ID
,这不会将默认值放入
SUB\u ID
。OP还说SUB\u ID可以变化。我读它的意思是它们都不一样范围很广,不一定每个值都需要显示。这似乎是针对SQL Server的问题-问题被标记为Oracle。