【问题标题】:Oracle sql group sumoracle sql组总和
【发布时间】:2015-09-02 11:35:44
【问题描述】:

我有带有 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 的值总和。如果某个特定 ID 的 SUB_ID 小于 MAXVALUE,则它应该采用每个 ID 的 MAX(SUB_ID) 如下所示(在此示例中,对于 SUB_ID 3 的 ID=100,它应该采用 150,即 2

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

这可以在 PL/SQL 中轻松完成。我们可以使用模型子句或任何其他选项来使用 SQL 吗

【问题讨论】:

  • 你能扩展上面的数据集吗?您的文字表明存在 id =100 和 sub_id = 3,但数据集中不存在该组合。
  • SUB_ID=3 是整个表的最大 SUB_ID。对于 ID=100,这不存在。所以它应该取 Max SUB_ID 的值为 100。所以它应该取 150。如果是 102,它应该取 100
  • 是否只有 3 个 sub_id?另外,您可以发布执行此逻辑的 pl/sql 吗?
  • 您能否将您的示例更新为仅不同的值,以便我了解您指的是哪 100 个。
  • 我们无法理解您的问题,请在问题中详细说明

标签: sql oracle oracle11g


【解决方案1】:

SQL Fiddle

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

Results

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 这似乎是针对 SQL Server 的 - 该问题用 Oracle 标记。
    【解决方案3】:

    这样的事情怎么样:

    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 来使用表值(如果存在),如果不存在则使用备用值。

    【讨论】:

    • OP 声明 SUB_IDs 的范围从 1...MAX - 如果所有 IDs 都缺少 SUB_ID,这将不会输入默认值。
    • OP 还说 sub_ids 可以变化。我读它的意思是它们可以在很宽的范围内,不一定每个值都需要存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 2020-09-23
    • 2014-04-05
    • 2016-01-23
    • 1970-01-01
    • 2010-11-16
    • 2021-08-21
    相关资源
    最近更新 更多