SQL显示在组中

时间:2012-08-16 20:55:03

标签: sql

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

  1. 客户1
    • 项目1
    • 项目2
    • 项目3
  2. 客户2
    • 项目1
    • 项目2
  3. 客户3
    • 项目1
    • 项目2
    • 项目3
  4. 这样我就可以从我的桌子上取回项目并让它们由客户“分组”。 你怎么称呼这个动作?它是嵌套组还是类似的东西?

2 个答案:

答案 0 :(得分:4)

SQL查询无法提供嵌套结果,因为您已经布置了 1 。相反,您的结果集必须是平的,多次重复Client,每个项目一次。实际上在您的SQL查询中,只需要将类似的Client值排序在一起排序:ORDER BY client

Client 1    Project 1
Client 1    Project 2
Client 1    Project 3
Client 2    Project 1
Client 2    Project 2
Client 2    Project 3

然后,在您的应用程序显示逻辑中,只有当值从前一个值更改时才打印新的Client

伪代码:

# Start with empty last_client
last_client = ""
loop_over_rows

  if last_client is not equal to current_row->client
    print new row->client

  # Print all projects
  print row->project

  # Store the current client to compare on next loop
  last_client = row->client
endloop

1 它可以在SQL中完成,有很多疯狂的字符串操作和UNION,但这是一个表示问题,真的属于应用程序表示逻辑而不是SQL

答案 1 :(得分:0)

如果您的标记中未指定的RDBMS支持递归SQL,则可以近似您要完成的布局。

以下SQL适用于Teradata的数据字典表。 Hierarchy列根据所有权链中数据库的深度进行偏移。从那里你应该能够采用这个概念并将其应用到你的情况。

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;