Oracle sql组和
我有一个带有ID、Sub_ID和值列的表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 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。