我有一组我想要报告的数据(在Oracle 12c中)。我希望根据'项目的价值来显示某些分组的总和。柱。如果ITEM =(' A',' B'或者' C'),那么他们会得到"分组"将Cost1和Cost2列的值汇总在一起。这被称为" Group1"。 Group2包含ITEMS(' D,E,F')。只有6个分组,由大约13个静态/固定项目组成。我确切地知道每个分组中的项目是什么。
这是一组示例数据,边框显示应该组合在一起的内容。第二个清单显示了输出应该是什么样子。我想我想在一个案例陈述中加以总结,但我似乎无法绕过它......
答案 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
即使出现新的项目或组,这也会使查询更加稳定。