我用CET递归做了查询结果如下
dj zch ljh ljmc zpgw
2 2180102003 0730303010 前端盖及附件总成 OP1140
1 2017000 2180102003 1 0TD1600
2 2180107003 0730303010 顶盖总成 OP1270W
1 2017000 2180107003 10TD1600
2 2200131001 0730303010 变速器后盖总成
1 2014000 2200131001 12TDS2000 NULL
2 2222102002 0730303010 前端盖及附件总成
1 2014000 2222102002 12TDS2000 NULL
我想实现以下显示:
dj zch ljh ljmc zpgw
2 2180102003 0730303010 前端盖及附件总成 OP1140
2 2180107003 0730303010 顶盖总成 OP1270W
1 2017000 2180102003 1 0TD1600
2 2200131001 0730303010 变速器后盖总成
2 2222102002 0730303010 前端盖及附件总成
1 2014000 2222102002 12TDS2000 NULL
这个能用SQL实现么?不想写存储过程和用cursor
------解决思路----------------------
你不贴表,我就把你的第一个结果当数据源了
你参考一下
--模拟数据表
IF OBJECT_ID('TempDB..#TB',N'U') IS NOT NULL
DROP TABLE #TB
GO
CREATE TABLE TempDB..#TB(
zch VARCHAR(100)
,ljh VARCHAR(100)
,ljmc VARCHAR(100)
,zpgw VARCHAR(100)
)
GO
INSERT INTO #TB
SELECT '2180102003','0730303010','前端盖及附件总成','OP1140'
UNION ALL
SELECT '2017000','2180102003','10TD1600',''
UNION ALL
SELECT '2180107003','0730303010','顶盖总成','OP1270W'
UNION ALL
SELECT '2017000','2180107003','10TD1600',''
UNION ALL
SELECT '2200131001','0730303010','变速器后盖总成',''
UNION ALL
SELECT '2014000','2200131001','12TDS2000',NULL
UNION ALL
SELECT '2222102002','0730303010','前端盖及附件总成',''
UNION ALL
SELECT '2014000','2222102002','12TDS2000',NULL
GO
--语句开始
WITH CTE AS(
SELECT A.zch,A.ljmc,A.zpgw,B.zch PID FROM #TB A LEFT JOIN #TB B ON A.zch=B.ljh GROUP BY A.zch,A.ljmc,A.zpgw,B.zch
)
,CTETB AS(
SELECT
A.*,ISNULL(C.zch,D.ljh) ljh
FROM CTE A
OUTER APPLY (SELECT TOP 1 B.zch FROM CTE B WHERE A.zch=B.PID)C
LEFT JOIN #TB D ON C.zch IS NULL AND A.zch=D.zch
)
,CET AS(
SELECT 1 dj,zch,ljh,ljmc,zpgw,CAST(zch AS VARCHAR(8000)) [PATH] FROM CTETB WHERE PID IS NULL
UNION ALL
SELECT
B.dj+1,A.zch,A.ljh,A.ljmc,A.zpgw,B.[PATH]+'-'+B.zch
FROM
CTETB A
INNER JOIN CET B ON A.PID=B.zch
)
SELECT dj,zch,ljh,ljmc,zpgw FROM CET ORDER BY [PATH] DESC,zch
--语句结束
2 2180102003 0730303010 前端盖及附件总成 OP1140
2 2180107003 0730303010 顶盖总成 OP1270W
1 2017000 2180102003 10TD1600
2 2200131001 0730303010 变速器后盖总成
2 2222102002 0730303010 前端盖及附件总成
1 2014000 2200131001 12TDS2000 NULL