2013-07-09 88 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,我想你會有你需要的。

相關問題