具有透视和聚合功能的Oracle SQL查询

具有透视和聚合功能的Oracle SQL查询,sql,oracle,aggregate,pivot-table,Sql,Oracle,Aggregate,Pivot Table,我在oracle中使用pivot表时遇到问题。我有一个工作示例,可以获取某些库存项目的计数。有两种类型的计数,但我只计算一种类型。我需要更改我的示例,以合并两种类型的计数,并使数据彼此“对齐”(如果有意义的话)。我会尽力解释的。考虑下面的查询: select * from ( select state_code, city_code, equipment_type, sum(AVAILABLE_COUNT) as available_count from EQUIP_VIEW_TAB

我在oracle中使用pivot表时遇到问题。我有一个工作示例,可以获取某些库存项目的计数。有两种类型的计数,但我只计算一种类型。我需要更改我的示例,以合并两种类型的计数,并使数据彼此“对齐”(如果有意义的话)。我会尽力解释的。考虑下面的查询:

select * 
from ( select state_code, city_code, equipment_type, sum(AVAILABLE_COUNT) as available_count
     from EQUIP_VIEW_TABLE
     group by state_code, city_code, equipment_type
     )
pivot (max(available_count)
     for (equipment_type) in 
     ('Sandbag' "CNT_SANDBAG",
      'Gabion Basket' "CNT_GABION_BASKET",
      'Rapid Deployment Floodwall' "CNT_RAPID_DEPLOYMENT_FLOODWALL",
      'Portable Coffer Dam' "CNT_PORTABLE_COFFER_DAM",
      'Polyethylene Sheeting' "CNT_POLYETHYLENE_SHEETING",
      'Pump' "CNT_PUMP"))
SELECT * 
FROM ( SELECT unique state_code, city_code, 
     equipment_type AS equipment_type_cnt, equipment_type as equipment_type_len, 
     sum(AVAILABLE_COUNT) AS available_count, SUM(AVAILABLE_COUNT_LENGTH) AS available_count_length
     FROM EQUIP_VIEW_TABLE
     GROUP BY state_code, city_code, equipment_type         )
pivot (MAX(available_count)
     FOR (equipment_type_cnt) IN 
     ('Sandbag' "CNT_SANDBAG",
      'Polyethylene Sheeting' "CNT_POLYETHYLENE_SHEETING",
      'Pump' "CNT_PUMP"))

pivot (MAX(available_count_length)
     FOR (equipment_type_len) IN 
     ('Gabion Basket' "CNT_GABION_BASKET",
      'Rapid Deployment Floodwall' "CNT_RAPID_DEPLOYMENT_FLOODWALL",
      'Portable Coffer Dam' "CNT_PORTABLE_COFFER_DAM"))
现在,这个查询可以很好地用于一种计数类型(“可用计数”)。数据都在州/市对应的同一行上,没有重复的数据,即

STATE  CITY      SANDBAGS BASKETS  FLOODWALL   DAM   SHEET   PUMP   
Texas  Austin    12        45      11           16   89      8
我需要说明不同类型的计数。我需要说明某些设备的“可用计数长度”。我试图通过以下查询来实现这一点:

select * 
from ( select state_code, city_code, equipment_type, sum(AVAILABLE_COUNT) as available_count
     from EQUIP_VIEW_TABLE
     group by state_code, city_code, equipment_type
     )
pivot (max(available_count)
     for (equipment_type) in 
     ('Sandbag' "CNT_SANDBAG",
      'Gabion Basket' "CNT_GABION_BASKET",
      'Rapid Deployment Floodwall' "CNT_RAPID_DEPLOYMENT_FLOODWALL",
      'Portable Coffer Dam' "CNT_PORTABLE_COFFER_DAM",
      'Polyethylene Sheeting' "CNT_POLYETHYLENE_SHEETING",
      'Pump' "CNT_PUMP"))
SELECT * 
FROM ( SELECT unique state_code, city_code, 
     equipment_type AS equipment_type_cnt, equipment_type as equipment_type_len, 
     sum(AVAILABLE_COUNT) AS available_count, SUM(AVAILABLE_COUNT_LENGTH) AS available_count_length
     FROM EQUIP_VIEW_TABLE
     GROUP BY state_code, city_code, equipment_type         )
pivot (MAX(available_count)
     FOR (equipment_type_cnt) IN 
     ('Sandbag' "CNT_SANDBAG",
      'Polyethylene Sheeting' "CNT_POLYETHYLENE_SHEETING",
      'Pump' "CNT_PUMP"))

pivot (MAX(available_count_length)
     FOR (equipment_type_len) IN 
     ('Gabion Basket' "CNT_GABION_BASKET",
      'Rapid Deployment Floodwall' "CNT_RAPID_DEPLOYMENT_FLOODWALL",
      'Portable Coffer Dam' "CNT_PORTABLE_COFFER_DAM"))
我尝试添加另一个pivot部分,我认为它可以工作,但它复制了值并将它们放在不同的行上。结果集看起来像

STATE  CITY      SANDBAGS SHEET  PUMP   BASKET   FLOODWALL   DAM   
Texas  Austin    12        89      8       16      -          -
Texas  Austin    12        89      8       -      11          -
Texas  Austin    12        89      8       -       -          16

它正在复制我的结果集中的行。我需要所有这些值在同一行上。我一直在尝试不同的想法,但我仍然得到重复的值。在此方面的任何帮助都将不胜感激。提前感谢你的帮助。如果我的问题有点太复杂或者解释得不够好,我会发布更多信息。谢谢。

如果我理解您的意图,我会将使用哪一列的决定移到主查询中,在单个
sum()中使用
大小写
表达式:

让枢轴保持原样:

SELECT * 
FROM ( SELECT unique state_code, city_code, 
     equipment_type, 
     sum(case when equipment_type in ('Gabion Basket',
         'Rapid Deployment Floodwall', 'Portable Coffer Dam')
       then AVAILABLE_COUNT_LENGTH
       else AVAILABLE_COUNT end) AS chosen_count
     FROM EQUIP_VIEW_TABLE
     GROUP BY state_code, city_code, equipment_type )
pivot (max(chosen_count)
     for (equipment_type) in 
     ('Sandbag' "CNT_SANDBAG",
      'Gabion Basket' "CNT_GABION_BASKET",
      'Rapid Deployment Floodwall' "CNT_RAPID_DEPLOYMENT_FLOODWALL",
      'Portable Coffer Dam' "CNT_PORTABLE_COFFER_DAM",
      'Polyethylene Sheeting' "CNT_POLYETHYLENE_SHEETING",
      'Pump' "CNT_PUMP"))

请为此设置一个sql FIDLE。好的,我来看看我能做些什么!。。。。这就是我试图实现的目标。我没有想到,甚至没有真正开始理解把这个案例陈述放在哪里。在我的另一个faield attmepts上,我把案件陈述放错了地方。但这是有效的。我已经测试过它,并将其用于我自己的目的。谢谢。