2013-07-09 3 views
1

Я собрал запрос, чтобы перечислить кучу связанных данных. Ниже приведен упрощенный вариант запроса, а также примерный вывод.Oracle - как группировать по столбцу на основе другого столбца

SELECT DISTINCT 
    A.NAME AS APP_NAME, 
    REPLACE(H.ENVIRONMENT,',','/') AS HOST_ENVIRONMENT, 
    S.NAME AS SERVER_NAME, 
    (SELECT 
     LISTAGG(HS.NAME_1, '/') WITHIN GROUP(ORDER BY HS.NAME_1) 
     FROM 
     HOST_SERVER HS 
    WHERE 
     HS.NAME_2 = S.NAME 
) AS HOST_NAMES, 
    CASE 
     WHEN S.LOCATION_ID IN (22,28,59) THEN 'ABC' 
     WHEN S.LOCATION_ID IN (6,8,9,11,53) THEN 'DBA' 
     WHEN S.LOCATION_ID IN (5,41,52,43,61) THEN 'ADFS' 
     WHEN S.LOCATION_ID IN (24,27,24,34,62,63,73) THEN 'ADR' 
     ELSE NULL 
    END AS HOST_LOCATION 
FROM 
    APP A 
    FULL OUTER JOIN APP_HOST AH ON A.ID = AH.ID_1 
    FULL OUTER JOIN HOST H ON AH.ID_2 = H.ID 
    FULL OUTER JOIN HOST_SVR HS ON H.ID = HS.ID_1 
    FULL OUTER JOIN SVR S ON HS.ID_2 = S.ID 
GROUP BY 
    A.NAME, 
    H.ENVIRONMENT, 
    S.NAME, 
    H.NAME, 
    S.LOCATION_ID, 
    S.LOCATION 
ORDER BY 
    A.NAME 

Пример вывода (не полный, некоторые несущественные столбцы опущены):

APP_NAME  HOST_ENVIRONMENT  SERVER_NAME  HOST_NAMES 
ABCD   Production   server1   host1/host2/host3 
ABCD   Production   server2   host4/host5/host6 
ABCD   Development   server1   host1/host2/host3 
ABCD   UBD     server2   host4/host5/host6 

То, что я хотел бы, чтобы выполнить это, по существу, группировать APP_NAME по окружающей среде. Мне нужна одна строка для Production и одна строка для чего-нибудь еще (просто называется Development - это хорошо). Ниже приведен пример того, что я хочу:

APP_NAME HOST_ENVIRONMENT SERVER_NAME  HOST_NAMES 
ABCD  Production   server1/server2 host1/host2/host3/host4/host5/host6    
ABCD  Development  server1/server2 host1/host2/host3/host4/host5/host6  

Как я могу сгруппировать эти приложения по окружающей среде? Очевидно, что это очень упрощенная версия, но я имею дело с тысячами строк. Спасибо за любую помощь!

+0

Возможно, [это] (http://stackoverflow.com/questions/4686543/sql-to-concatenate-column-values-from-multiple-rows) может помочь – Lamak

+0

вы можете показать нам свои данные из всех таблиц используется в вашем запросе? –

ответ

0

Вы можете группировать по нескольким столбцам, например. group by app_name, host_environment, а затем используйте агрегированную функцию listagg для объединения имен серверов в одну строку. Ваши данные не показывают, как вы хотите обрабатывать несколько значений в столбце имени_по_и_и_и_и_и_.

+0

Я просто хочу две строки для каждого APP_NAME, Production and Development. В следующем приложении «EFGH» также будет «Производство и разработка». – ad2387

+0

@ ad2387 ну, то, что я сказал, правильно - группа этими двумя столбцами и суммирует остальные. –

1

Пожалуйста, смотрите следующий запрос, возможно, будет полезно для вас:

CREATE TABLE test(
    APP_NAME   VARCHAR2(100), 
    HOST_ENVIRONMENT VARCHAR2(100), 
    SERVER_NAME  VARCHAR2(100), 
    HOST_NAMES  VARCHAR2(100) 
); 

INSERT INTO test VALUES('ABCD','Production','server1','host1/host2/host3'); 
INSERT INTO test VALUES('ABCD','Production','server2','host4/host5/host6'); 
INSERT INTO test VALUES('ABCD','Development','server1','host1/host2/host3'); 
INSERT INTO test VALUES('ABCD','UBD','server2','host4/host5/host6'); 

/* CHECK THIS QUERY */ 
SELECT APP_NAME,HOST_ENVIRONMENT, 
listagg(SERVER_NAME,'/') WITHIN GROUP (ORDER BY SERVER_NAME) AS SERVER_NAME, 
listagg(HOST_NAMES,'/') WITHIN GROUP (ORDER BY HOST_NAMES) AS HOST_NAMES 
FROM test 
GROUP BY APP_NAME,HOST_ENVIRONMENT 

Для попробовать это смотрите этот link

ПРИМЕЧАНИЕ: это решение для группировки и проблемы concatenacion, не вы получите дополнительную информацию (например, таблицы, данные и т. д.).

Я знаю, что это нехорошее решение, но вы можете заменить мой TEST своим запросом, и я думаю, что у вас будет то, что вам нужно.

Смежные вопросы