1

我想要一个可以在所有平台上运行并以树结构(虽然不是真正的树结构)格式给出结果的 SQL 语句。即所有相关列一起出现。是否可以使用 sql 实现以下格式。我有一个包含三列(GROUP_STEP、PREDECESSOR、COLUMNNUM)的简单表。预期产出 在此处输入图像描述

支持的平台:Oracle、SQL Server、DB2 和 Sybase。我正在从具有不同格式的以下数据的表中查找 SELECT 语句。

在@diaho 建议之后,以下是输出 在此处输入图像描述

4

2 回答 2

0

根据您的表,我假设您的原始表中只有Group_StepPredecessor列,并且该ColumnNum列表示树中叶子的总级别数。例如,since PC_Wrap1have the Predecessor BENEFITSwhich has thePredecessor COPY_BUDG它共有 3 个“级别”。如果是这种情况,您需要一个递归查询来计算该ColumnNum值。我不能对所有平台说话,但对于 SQL Server,您可以使用 CTE:

编辑:根据 a_horse_with_no_name 的建议删除了“可怕的非标准方括号”:)

-- Setup table
CREATE TABLE #Temp
(
    Group_Step VARCHAR(100),
    Predecessor VARCHAR(100)
)

-- Setup dummy data
INSERT INTO #Temp
(
    Group_Step,
    Predecessor
)
SELECT 'ACT_BD_ACT', '' UNION
SELECT 'COPY_BUDG', '' UNION
SELECT 'COPY_BUDG2', '' UNION
SELECT 'BENEFITS', 'COPY_BUDG' UNION
SELECT 'BENEFITS', 'COPY_BUDG2' UNION
SELECT 'PC_WRAP1', 'BENEFITS' UNION
SELECT 'PC_WRAP2', 'BENEFITS' UNION
SELECT 'ALLC1', '' UNION
SELECT 'ALLC2', '' UNION
SELECT 'ALLC3', 'ALLC2' UNION
SELECT 'TCP1', 'ALLC3' UNION
SELECT 'TCP1', 'ALLC4' UNION
SELECT 'COPY_BUDG3', '' UNION
SELECT 'COPY_BUDG4', '';

-- Actual solution starts here:
WITH Result
(
    Group_Step,
    Predecessor,
    ColumnNum
)
AS
(
-- Anchor member definition
SELECT
    Group_Step,
    Predecessor AS Predecessor,
    1 AS ColumnNum
FROM
    #Temp
WHERE
    Predecessor = ''
UNION ALL
-- Recursive member definition
SELECT
    t.Group_Step,
    t.Predecessor,
    ColumnNum + 1 AS ColumnNum
FROM
    #Temp AS t
JOIN
    Result AS r
ON
    t.Predecessor = r.Group_Step    
)
-- Statement that executes the CTE
SELECT DISTINCT
    Group_Step,
    Predecessor,
    ColumnNum
FROM
    Result
-- EDIT #2: Adding ORDER BY per Op's comment
ORDER BY
    ColumnNum

DROP TABLE #Temp
于 2013-04-27T04:40:19.867 回答
0
select groupnum,predecessor ,count(groupnum) as columnum group by groupnum,predecessor

如果您提供有关表架构的更多详细信息,答案可能会改变!

于 2013-04-26T23:38:53.723 回答