我想要一个可以在所有平台上运行并以树结构(虽然不是真正的树结构)格式给出结果的 SQL 语句。即所有相关列一起出现。是否可以使用 sql 实现以下格式。我有一个包含三列(GROUP_STEP、PREDECESSOR、COLUMNNUM)的简单表。预期产出
支持的平台:Oracle、SQL Server、DB2 和 Sybase。我正在从具有不同格式的以下数据的表中查找 SELECT 语句。
在@diaho 建议之后,以下是输出
根据您的表,我假设您的原始表中只有Group_Step
和Predecessor
列,并且该ColumnNum
列表示树中叶子的总级别数。例如,since PC_Wrap1
have the Predecessor
BENEFITS
which 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
select groupnum,predecessor ,count(groupnum) as columnum group by groupnum,predecessor
如果您提供有关表架构的更多详细信息,答案可能会改变!