如何使用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-很好。我会更新的。这很好用,非常感谢。我不确定它为什么会起作用,但我会仔细研究一下,看看是否可以使用它更好地理解透视表。