2015-10-26 5 views
0

У меня возникли проблемы со сводными таблицами в oracle. У меня есть рабочий пример, который подсчитывает количество элементов инвентаря. Существует два типа счетчиков, но я учитываю только один тип. Мне нужно изменить свой пример, чтобы включить два типа счетчиков и поддерживать данные «в строке» друг с другом (если это имеет смысл). Я попытаюсь изо всех сил объяснить. Рассмотрим следующий запрос:Oracle SQL-запрос с функцией 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")) 

Теперь этот запрос хорошо подходит для одного типа счетчика («доступный счет»). Данные все на ту же строку, соответствующей государственный/город и никаких данных не дублируются, т.е.

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

ok я посмотрю, что я могу сделать – 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