2015-10-26 77 views
0

我在Oracle中的数据透视表遇到问题。我有一个工作示例,可以获取某些库存项目的计数。有两种类型的计数,但我只占一种类型。我需要改变我的示例以合并两种类型的计数,并保持数据彼此“在线”(如果有意义的话)。我会尽力解释。考虑以下查询:带有数据透视表和聚合函数的Oracle SQL查询

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")) 

现在,此查询适用于一种类型的计数(“可用计数”)。该数据是所有对应于国家/城市在同一行,并没有数据被复制,即

STATE CITY  SANDBAGS BASKETS FLOODWALL DAM SHEET PUMP 
Texas Austin 12  45  11   16 89  8 

我需要考虑不同类型的计数。我需要考虑某些设备上的“可用计数长度”。我试着用下面的查询来实现:

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 SHEET PUMP BASKET FLOODWALL DAM 
Texas Austin 12  89  8  16  -   - 
Texas Austin 12  89  8  -  11   - 
Texas Austin 12  89  8  -  -   16 

它复制在我的结果集的行。我会在同一行上需要所有这些值。我一直在尝试不同的想法,但我仍然得到重复的价值观。任何帮助,将不胜感激。在此先感谢您的帮助。如果我的问题太复杂,或者我没有足够解释,我会发布更多信息。谢谢。

+1

请为此设置一个sql小提琴。 –

+0

好的,我会看看我能做什么 – user1898629

回答

0

如果我理解你想要做什么,我会继续前进的列使用最多到主查询的决定,用case表达单sum()内:

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 

离开原因如下:

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")) 
+0

Bing0!....这就是我想要完成的。我没有想到或甚至没有开始明白将案例陈述放在哪里。在我的另一个例外情况中,我在错误的地方发现了案件陈述。但这是有效的。我测试过它并将其用于我自己的目的。非常感谢。 – user1898629