SQL分组显示

SQL分组显示,sql,Sql,我有一个项目表,所有项目都标记了相关客户端的查找,并希望显示如下数据: 客户1 项目1 项目2 项目3 客户2 项目1 项目2 客户3 项目1 项目2 项目3 这样,我就可以从表中取回项目,并按客户对它们进行分组。 你把这种行为称为什么?它是嵌套组还是类似的东西?SQL查询无法提供嵌套结果,因为您已经布置了1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序 然后,在应用程序显示逻辑中,仅当值与前一个值不同时

我有一个项目表,所有项目都标记了相关客户端的查找,并希望显示如下数据:

客户1 项目1 项目2 项目3 客户2 项目1 项目2 客户3 项目1 项目2 项目3 这样,我就可以从表中取回项目,并按客户对它们进行分组。
你把这种行为称为什么?它是嵌套组还是类似的东西?

SQL查询无法提供嵌套结果,因为您已经布置了1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序

然后,在应用程序显示逻辑中,仅当值与前一个值不同时才打印新客户端

伪代码:
1它可以在SQL中通过大量疯狂的字符串操作和联合来完成,但这是一个表示问题,真正属于应用程序表示逻辑,而不是SQL。

SQL查询无法提供如您所述的嵌套结果1。相反,结果集必须是平面的,重复客户端多次,每个项目一次。实际上,在SQL查询中,将类似的客户机值排序在一起只是一个排序问题:按客户机排序

然后,在应用程序显示逻辑中,仅当值与前一个值不同时才打印新客户端

伪代码:
1它可以在SQL中通过大量疯狂的字符串操作和联合来完成,但这是一个表示问题,真正属于应用程序表示逻辑而不是SQL。

如果您的RDBMS(未在标记中指定)支持递归SQL,则您可以近似于您尝试完成的布局

以下SQL适用于Teradata的数据字典表。“层次结构”列根据数据库在所有权链中的深度进行偏移。从那以后,你应该能够接受这个概念并将其应用到你的情况中

WITH RECURSIVE cte (DatabaseName, Path, Parent, Level) AS
 (
  SELECT TRIM(DatabaseName)
         ,DatabaseName(VARCHAR(600))
         ,TRIM(DatabaseName)
         ,0 (BYTEINT)
  FROM   DBC.Databases d
  WHERE  DatabaseName = 'DBC'

  UNION ALL

  SELECT TRIM(d.DatabaseName)
         ,cte.Path || '.' || TRIM(d.DatabaseName)
         ,cte.Path
         ,Level + 1
  FROM   DBC.Databases d
         ,cte
  WHERE  d.OwnerName = cte.DatabaseName
  AND    d.DatabaseName <> d.OwnerName
  AND    Level < 20
 )
SELECT Level
     , SUBSTRING(CAST('' AS CHAR(60)) FROM 1 FOR Level * 2)  || DatabaseName AS Hierarchy
     , Path
     , Parent
FROM   cte
ORDER BY Path;

如果您的RDBMS(标记中未指定)支持递归SQL,则可以近似于您试图完成的布局

以下SQL适用于Teradata的数据字典表。“层次结构”列根据数据库在所有权链中的深度进行偏移。从那以后,你应该能够接受这个概念并将其应用到你的情况中

WITH RECURSIVE cte (DatabaseName, Path, Parent, Level) AS
 (
  SELECT TRIM(DatabaseName)
         ,DatabaseName(VARCHAR(600))
         ,TRIM(DatabaseName)
         ,0 (BYTEINT)
  FROM   DBC.Databases d
  WHERE  DatabaseName = 'DBC'

  UNION ALL

  SELECT TRIM(d.DatabaseName)
         ,cte.Path || '.' || TRIM(d.DatabaseName)
         ,cte.Path
         ,Level + 1
  FROM   DBC.Databases d
         ,cte
  WHERE  d.OwnerName = cte.DatabaseName
  AND    d.DatabaseName <> d.OwnerName
  AND    Level < 20
 )
SELECT Level
     , SUBSTRING(CAST('' AS CHAR(60)) FROM 1 FOR Level * 2)  || DatabaseName AS Hierarchy
     , Path
     , Parent
FROM   cte
ORDER BY Path;

非常感谢。我不确定这是在SQL中还是在应用程序逻辑本身中完成的,但直到我知道我不得不问。谢谢你的详细回答,真的很有帮助!非常感谢。我不确定这是在SQL中还是在应用程序逻辑本身中完成的,但直到我知道我不得不问。谢谢你的详细回答,真的很有帮助!
WITH RECURSIVE cte (DatabaseName, Path, Parent, Level) AS
 (
  SELECT TRIM(DatabaseName)
         ,DatabaseName(VARCHAR(600))
         ,TRIM(DatabaseName)
         ,0 (BYTEINT)
  FROM   DBC.Databases d
  WHERE  DatabaseName = 'DBC'

  UNION ALL

  SELECT TRIM(d.DatabaseName)
         ,cte.Path || '.' || TRIM(d.DatabaseName)
         ,cte.Path
         ,Level + 1
  FROM   DBC.Databases d
         ,cte
  WHERE  d.OwnerName = cte.DatabaseName
  AND    d.DatabaseName <> d.OwnerName
  AND    Level < 20
 )
SELECT Level
     , SUBSTRING(CAST('' AS CHAR(60)) FROM 1 FOR Level * 2)  || DatabaseName AS Hierarchy
     , Path
     , Parent
FROM   cte
ORDER BY Path;