2013-07-09 47 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。我想要一条生产线和一条生产线(就是所谓的开发很好)。以下是我想要的示例:

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

您可以按多列分组,例如,按app_name,host_environment分组,然后使用listagg聚合函数将server_names合并为一个字符串。您的数据不会显示您想要如何处理app_name列中的多个值。

+0

我基本上只想为每个APP_NAME,生产和开发两行。例如,下一个应用程序'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,我想你会有你需要的。

相关问题