如何使用oracle sql汇总/透视数据
我有一张包含地质资源信息的表格如何使用oracle sql汇总/透视数据,sql,oracle,Sql,Oracle,我有一张包含地质资源信息的表格 | Property | Zone | Area | Category | Tonnage | Au_gt | Au_oz | |----------|------|-------------|-----------|---------|-------|-------| | Ket | Eel | Open Pit | Measured | 43400 | 5.52 | 7700 | | Ket | Eel
| Property | Zone | Area | Category | Tonnage | Au_gt | Au_oz |
|----------|------|-------------|-----------|---------|-------|-------|
| Ket | Eel | Open Pit | Measured | 43400 | 5.52 | 7700 |
| Ket | Eel | Open Pit | Inferred | 51400 | 5.88 | 9700 |
| Ket | Eel | Open Pit | Indicated | 357300 | 6.41 | 73600 |
| Ket | Eel | Underground | Measured | 3300 | 7.16 | 800 |
| Ket | Eel | Underground | Inferred | 14700 | 6.16 | 2900 |
| Ket | Eel | Underground | Indicated | 168100 | 8.85 | 47800 |
我想总结一下数据,以便我们的客户更容易阅读
| Property | Zone | Category | Open_Pit_Tonnage | Open_Pit_Au_gt | Open_Pit_Au_oz | Underground_tonnage | Underground_au_gt | Underground_au_oz | Combined_tonnage | Combined_au_gt | Combined_au_oz |
|----------|------|-----------|------------------|----------------|----------------|---------------------|-------------------|-------------------|------------------|----------------|----------------|
| Ket | Eel | Measured | 43,400 | 5.52 | 7,700 | 3,300 | 7.16 | 800 | 46,700 | 5.64 | 8,500 |
| Ket | Eel | Indicated | 357,300 | 6.41 | 73,600 | 168,100 | 8.85 | 47,800 | 525,400 | 7.19 | 121,400 |
| Ket | Eel | Inferred | 51,400 | 5.88 | 9,700 | 14,700 | 6.16 | 2,900 | 66,100 | 5.94 | 12,600 |
我对透视表相当陌生。如何编写查询来翻译和汇总数据
谢谢 条件聚合是一种简单的方法:
select Property, Zone, Category,
max(case when area = 'Open Pit' then tonnage end) as open_pit_tonnage,
max(case when area = 'Open Pit' then Au_gt end) as open_pit_Au_gt,
max(case when area = 'Open Pit' then Au_oz end) as open_pit_Au_ox,
max(case when area = 'Underground' then tonnage end) as Underground_tonnage,
max(case when area = 'Underground' then Au_gt end) as Underground_Au_gt,
max(case when area = 'Underground' then Au_oz end) as Underground_Au_ox
from t
group by Property, Zone, Category
SQL Server PIVOT运算符用于将行转换为列 目标是将输出的第一列中的类别名称转换为多列,并计算每个类别的产品数量 上表中可以考虑此查询参考:
SELECT * FROM
(
SELECT
category_name,
product_id,
model_year
FROM
production.products p
INNER JOIN production.categories c
ON c.category_id = p.category_id
) t
PIVOT(
COUNT(product_id)
FOR category_name IN (
[Children Bicycles],
[Comfort Bicycles],
[Cruisers Bicycles],
[Cyclocross Bicycles],
[Electric Bikes],
[Mountain Bikes],
[Road Bikes])
) AS pivot_table;
如果您的Oracle版本是11.1或更高版本(如果您是相对较新的用户,则应该是这样!),则可以使用
PIVOT
操作符,如下所示
请注意,PIVOT
操作的结果可以指定一个别名(我使用了p
)-这使得编写SELECT
子句更容易
我假设您的表名为geological\u data
——将其替换为实际的表名
select p.*
, open_pit_tonnage + underground_tonnage as combined_tonnage
, open_pit_au_gt + underground_au_gt as combined_au_gt
, open_pit_au_oz + underground_au_oz as combined_au_oz
from geological_data
pivot (sum(tonnage) as tonnage, sum(au_gt) as au_gt, sum(au_oz) as au_oz
for area in ('Open Pit' as open_pit, 'Underground' as underground)) p
;
您了解“Oracle SQL”和“SQL Server”之间的区别吗?OP将这个问题清楚地标记为“Oracle”,因此“SQL Server”的答案将自动获得我的否决票。请随意删除您的答案,除非您可以为Oracle重写它。另外,请为您的代码使用格式化工具。您在最后一列中显示的数字(
combined______oz
)似乎是错误的-例如,在第一行中,单个数字是7700
和800
,您如何得到54400
的总和?@mathguy-很好。我会更新的。这很好用,非常感谢。我不确定它为什么会起作用,但我会仔细研究一下,看看是否可以使用它更好地理解透视表。