具有透视和聚合功能的Oracle SQL查询
我在oracle中使用pivot表时遇到问题。我有一个工作示例,可以获取某些库存项目的计数。有两种类型的计数,但我只计算一种类型。我需要更改我的示例,以合并两种类型的计数,并使数据彼此“对齐”(如果有意义的话)。我会尽力解释的。考虑下面的查询:具有透视和聚合功能的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
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上,我把案件陈述放错了地方。但这是有效的。我已经测试过它,并将其用于我自己的目的。谢谢。