Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将一组链值分组_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 将一组链值分组

Sql server 将一组链值分组,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我在SQL Server 2008中有下表 DECLARE @UnitConvert table ( ID int identity(1,1), ConvertUnitOne nvarchar(50), ConvertUnitTwo nvarchar(50) ) INSERT INTO @UnitConvert SELECT 100,500 UNION ALL SELECT 200,100 UNION ALL SELECT 500,300 UNION ALL SELECT 2

我在SQL Server 2008中有下表

DECLARE @UnitConvert table 
(
  ID int identity(1,1),
  ConvertUnitOne nvarchar(50),
  ConvertUnitTwo nvarchar(50)
) 


INSERT INTO @UnitConvert
SELECT 100,500
UNION ALL SELECT 200,100
UNION ALL SELECT 500,300
UNION ALL SELECT 2000,1000
UNION ALL SELECT 3000,9000
UNION ALL SELECT 2000,700
UNION ALL SELECT 820,3000

SELECT * FROM @UnitConvert
这里UnitConvertOne中的值等于UnitConvertTwo 所以它有一个价值链

所以我想把结果显示为

Group         unit

1             100

              200

              300

              500

2             700

              1000

              2000

3             820

              3000

              9000
组值将根据可以创建的组数自动递增
得益于sqlservercentral.com上的Eugene洗脱素,单位值可以从小到大排序

DECLARE @UnitConvert table 
(
  ID int identity(1,1),
  ConvertUnitOne nvarchar(50),
  ConvertUnitTwo nvarchar(50)
) 

INSERT INTO @UnitConvert
SELECT 100,500
UNION ALL SELECT 200,100
UNION ALL SELECT 500,300
UNION ALL SELECT 2000,1000
UNION ALL SELECT 3000,9000
UNION ALL SELECT 2000,700
UNION ALL SELECT 820,3000

;WITH cteUP AS
(
 SELECT  ConvertUnitTwo AS childUP, ConvertUnitOne AS unitUP, 0 AS Lvl
 FROM @UnitConvert 
 UNION ALL 
 SELECT cte.childUP, u.ConvertUnitOne AS unitUP, Lvl = Lvl + 1 
 FROM @UnitConvert u
 INNER  JOIN cteUP cte ON cte.unitUP = u.ConvertUnitTwo
)
--select * from cteUP
SELECT   c.ConvertUnit
        ,DENSE_RANK() OVER (ORDER BY ISNULL(cm.unitUP, c.ConvertUnit)) AS GrpNO
FROM   (SELECT ConvertUnitOne AS ConvertUnit FROM @UnitConvert 
        UNION 
        SELECT ConvertUnitTwo AS ConvertUnit FROM @UnitConvert) c
OUTER APPLY (SELECT  TOP 1 unitUP FROM cteUP m WHERE
             m.childUP = c.ConvertUnit ORDER BY Lvl DESC) cm

我无法理解。UnitConvertOne如何等同于UnitConvertTwo?输出的逻辑是什么?我们插入一些尺寸单位,相当于这里插入的某个单位,我们插入100=500200=100500=300..因此100200300500对预期输出进行分组编辑