Sql Oracle—如何基于另一列按列分组

Sql Oracle—如何基于另一列按列分组,sql,oracle,Sql,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

我把一个查询放在一起,列出了一组相关数据。下面是查询的简化版本以及示例输出

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_名称进行分组。我想要一条生产线,另一条生产线(只需称为开发即可)。下面是我想要的示例:

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       

如何按环境对这些应用程序进行分组?显然,这是一个非常简化的版本,但我处理的是数千行。谢谢你的帮助

您可以按多列分组,例如按应用程序名称、主机环境分组,然后使用Listag聚合函数将服务器名称组合成单个字符串。您的数据没有显示您希望如何处理“应用程序名称”列中的多个值。

您可以按多个列分组,例如按应用程序名称、主机环境分组,然后使用Listag聚合函数将服务器名称组合成单个字符串。您的数据未显示您希望如何处理app_name列中的多个值。

请查看以下查询,可能对您有用:

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
要尝试此功能,请参阅此

注意:这是针对分组和合并问题的解决方案,不是针对您的问题的完整解决方案,您必须发布更多信息(例如,表格、数据等)


我知道这不是一个好的解决方案,但你可以用你的查询替换我的表测试,我想你会得到你需要的。

请查看以下查询,可能对你有用:

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
要尝试此功能,请参阅此

注意:这是针对分组和合并问题的解决方案,不是针对您的问题的完整解决方案,您必须发布更多信息(例如,表格、数据等)


我知道这不是一个好的解决方案,但您可以用查询替换我的表测试,我想你会得到你所需要的。

也许你能帮我们看看你查询中使用的所有表中的样本数据吗?也许你能帮我们看看你查询中使用的所有表中的样本数据吗?我基本上只需要为每个应用程序名称、生产和开发两行。下一个应用程序“EFGH”也会有生产和开发,例如。@ad2387好吧,那么我说的是正确的——按这两列分组并聚合其余的。我基本上只希望每个应用程序的名称、生产和开发有两行。例如,下一个应用程序“EFGH”也将有生产和开发。@ad2387好吧,那么我所说的是正确的——按照这两列进行分组,并将其余的进行聚合。