Oracle - 如何汇总相关项目?

时间:2015-12-22 13:48:21

标签: sql oracle

我有一组我想要报告的数据(在Oracle 12c中)。我希望根据'项目的价值来显示某些分组的总和。柱。如果ITEM =(' A',' B'或者' C'),那么他们会得到"分组"将Cost1和Cost2列的值汇总在一起。这被称为" Group1"。 Group2包含ITEMS(' D,E,F')。只有6个分组,由大约13个静态/固定项目组成。我确切地知道每个分组中的项目是什么。

这是一组示例数据,边框显示应该组合在一起的内容。第二个清单显示了输出应该是什么样子。我想我想在一个案例陈述中加以总结,但我似乎无法绕过它......

Grouping output

4 个答案:

答案 0 :(得分:3)

CASE语句适用于此类一次性值转换:

SELECT
  Year,
  CASE
    WHEN Item IN ('A', 'B', 'C') THEN 'Group1'
    WHEN Item IN ('D', 'E', 'F') THEN 'Group2'
    ELSE 'Others' END AS Item,
  SUM(Cost1),
  SUM(Cost2)
FROM myTable
GROUP BY
  Year,
  CASE
    WHEN Item IN ('A', 'B', 'C') THEN 'Group1'
    WHEN Item IN ('D', 'E', 'F') THEN 'Group2'
    ELSE 'Others' END;

请注意,GROUP BY表达式必须与列选择列表中的完全一致,除非您必须删除别名(AS Item)。

答案 1 :(得分:3)

看起来你想要Group By查询:

  select Year,
         case
           when item = 'A' or item = 'B' or item = 'C' then
             'Group1' 
           else 
             'Group2' 
         end as Item 
         Sum(nvl(Cost1, 0)) as Cost1, -- note NVL to prevent nulls from summing
         Sum(nvl(Cost2, 0) as Cost2
    from MyTable
group by Year,
         Item

答案 2 :(得分:2)

如果未存储组的值,则最简单的方法是使用case语句和聚合函数。您可以使用值创建一个cte以便于维护;或者可能是pipelined tablefunction

Select year, case when item in ('A','B','C') then 'Group1'
            when item in ('D','E','F' then 'GROUP2' else
            'Unhandled' end as Item, Sum(Cost1) as cost1, Sum(Cost2) as cost2
From TableName
Group by year, case when item in ('A','B','C') then 'Group1'
            when item in ('D','E','F' then 'GROUP2' else
            'Unhandled' end 

答案 3 :(得分:1)

除了使用CASE进行映射之外,您还可以在专用表myItem

中提取映射逻辑
  CREATE TABLE  myItem 
   ("ITEM" VARCHAR2(1), 
    "GROUP_ID" VARCHAR2(6), 
     PRIMARY KEY ("ITEM")
   );

并加入此表以在GROUPing

之前获取该组
with add_group as (
select a.*, b.group_id from myTable a
left outer join myItem b
on a.item = b.item
)
select .... your GROUP BY query here

即使出现新的项目或组,这也会使查询更加稳定。