设计递归数据

Persistence_x 2018-07-13 12:24:19
第一级 第二级 第三级 第四级 变量代码
因变量 统计局口径 汽油表观消费量 ytq
车辆变量 汽油车 保有量 标准车 cqb0
宏观变量 国内生产总值 hgdp

设计表

查询结果如上
...全文
213 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
在线等, 写到一半,感觉递归 有些问题了,
二月十六 2018-07-13
  • 打赏
  • 举报
回复
引用 15 楼 xiaohuaidan1988 的回复:
[quote=引用 13 楼 sinat_28984567 的回复:]
你看是这个意思不
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([VariableCode] int,[VariableName] nvarchar(24),[PVariableCode] INT,[VariableFullName] NVARCHAR(100))
Insert #T
select 1,N'根目录',0,'A' union all
select 2,N'第一级1',1,'A' union all
select 3,N'第一级2',1,'A' union all
select 4,N'第二级',3,'A' union all
select 5,N'B根目录',0,'B'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = '
;WITH cte AS (
Select *,1 AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
select VariableFullName'
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY VariableFullName ORDER BY PVariableCode) AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
SELECT @sql = @sql + ',max(case rn when ' + RTRIM(rn)
+ ' then VariableName else '''' end)[第' + RTRIM(rn) + '级]'
FROM ( SELECT DISTINCT
rn
FROM cte
) a
SET @sql = @sql
+ ' from cte group by VariableFullName'
EXEC(@sql)



你好,版主, 用这个declare 无法创建视图啊,
能不能直接像select 这样查询出来的, 因为我要创建视图, 或者left join 这个结果 使用 [/quote]
这种的直接动态拼接,可以用存储过程实现
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 13 楼 sinat_28984567 的回复:
你看是这个意思不
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([VariableCode] int,[VariableName] nvarchar(24),[PVariableCode] INT,[VariableFullName] NVARCHAR(100))
Insert #T
select 1,N'根目录',0,'A' union all
select 2,N'第一级1',1,'A' union all
select 3,N'第一级2',1,'A' union all
select 4,N'第二级',3,'A' union all
select 5,N'B根目录',0,'B'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = '
;WITH cte AS (
Select *,1 AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
select VariableFullName'
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY VariableFullName ORDER BY PVariableCode) AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
SELECT  @sql = @sql + ',max(case rn when ' + RTRIM(rn)
        + ' then VariableName else '''' end)[第' + RTRIM(rn) + '级]'
FROM    ( SELECT DISTINCT
                    rn
          FROM      cte
        ) a
SET @sql = @sql
    + ' from cte group by VariableFullName'
EXEC(@sql)

你好,版主, 用这个declare 无法创建视图啊, 能不能直接像select 这样查询出来的, 因为我要创建视图, 或者left join 这个结果 使用
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 13 楼 sinat_28984567 的回复:
你看是这个意思不
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([VariableCode] int,[VariableName] nvarchar(24),[PVariableCode] INT,[VariableFullName] NVARCHAR(100))
Insert #T
select 1,N'根目录',0,'A' union all
select 2,N'第一级1',1,'A' union all
select 3,N'第一级2',1,'A' union all
select 4,N'第二级',3,'A' union all
select 5,N'B根目录',0,'B'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = '
;WITH cte AS (
Select *,1 AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
select VariableFullName'
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY VariableFullName ORDER BY PVariableCode) AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
SELECT  @sql = @sql + ',max(case rn when ' + RTRIM(rn)
        + ' then VariableName else '''' end)[第' + RTRIM(rn) + '级]'
FROM    ( SELECT DISTINCT
                    rn
          FROM      cte
        ) a
SET @sql = @sql
    + ' from cte group by VariableFullName'
EXEC(@sql)

应该是的,我研究一下,谢谢
二月十六 2018-07-13
  • 打赏
  • 举报
回复
你看是这个意思不
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([VariableCode] int,[VariableName] nvarchar(24),[PVariableCode] INT,[VariableFullName] NVARCHAR(100))
Insert #T
select 1,N'根目录',0,'A' union all
select 2,N'第一级1',1,'A' union all
select 3,N'第一级2',1,'A' union all
select 4,N'第二级',3,'A' union all
select 5,N'B根目录',0,'B'
Go
--测试数据结束
DECLARE @sql VARCHAR(MAX)
SET @sql = '
;WITH cte AS (
Select *,1 AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
select VariableFullName'
;WITH cte AS (
Select *,ROW_NUMBER()OVER(PARTITION BY VariableFullName ORDER BY PVariableCode) AS rn from #T WHERE PVariableCode=0
UNION ALL
SELECT #T.*,cte.rn+1 FROM #T JOIN cte ON #T.PVariableCode=cte.VariableCode
)
SELECT @sql = @sql + ',max(case rn when ' + RTRIM(rn)
+ ' then VariableName else '''' end)[第' + RTRIM(rn) + '级]'
FROM ( SELECT DISTINCT
rn
FROM cte
) a
SET @sql = @sql
+ ' from cte group by VariableFullName'
EXEC(@sql)



Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 10 楼 wwfxgm 的回复:
[quote=引用 9 楼 xiaohuaidan1988 的回复:] [quote=引用 8 楼 sinat_28984567 的回复:] [quote=引用 7 楼 xiaohuaidan1988 的回复:] 可以的, 这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以
再加一列级别就可以实现了 select * from 表 a left join 表 b on a.PVariableCode = b.VariableCode and a.级别=4 and b.级别=3.....[/quote] 这个不用递归肯定不行吧, 我不一定是4级, 也许后期有需求,改成五级,6级呢,[/quote] 版主这样写。你是用五级,六级 那里,改用参数就行了。那样不管多少级都行了。[/quote]
select * from SCS_Test a left join SCS_Test b  on a.PVariableCode = b.VariableCode 

and a.VariableLevel=4 and b.VariableLevel=3 
后面的... 是什么, 查不到第2级和 第一级
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
[quote=引用 7 楼 xiaohuaidan1988 的回复:] 可以的, 这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以
再加一列级别就可以实现了 select * from 表 a left join 表 b on a.PVariableCode = b.VariableCode and a.级别=4 and b.级别=3.....[/quote]
select * from SCS_Test a left join SCS_Test b  on a.PVariableCode = b.VariableCode 

and a.VariableLevel=4 and b.VariableLevel=3 
第2级和 第一级查不出来
wwfxgm 2018-07-13
  • 打赏
  • 举报
回复
引用 9 楼 xiaohuaidan1988 的回复:
[quote=引用 8 楼 sinat_28984567 的回复:]
[quote=引用 7 楼 xiaohuaidan1988 的回复:]

可以的,
这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以


再加一列级别就可以实现了
select * from 表 a left join 表 b on a.PVariableCode = b.VariableCode and a.级别=4 and b.级别=3.....[/quote]
这个不用递归肯定不行吧, 我不一定是4级, 也许后期有需求,改成五级,6级呢,[/quote]

版主这样写。你是用五级,六级 那里,改用参数就行了。那样不管多少级都行了。
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
[quote=引用 7 楼 xiaohuaidan1988 的回复:] 可以的, 这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以
再加一列级别就可以实现了 select * from 表 a left join 表 b on a.PVariableCode = b.VariableCode and a.级别=4 and b.级别=3.....[/quote] 这个不用递归肯定不行吧, 我不一定是4级, 也许后期有需求,改成五级,6级呢,
二月十六 2018-07-13
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuaidan1988 的回复:
可以的,
这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以


再加一列级别就可以实现了
select * from 表 a left join 表 b on a.PVariableCode = b.VariableCode and a.级别=4 and b.级别=3.....
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
[quote=引用 4 楼 xiaohuaidan1988 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:] 描述 级别 变量代码
Excel就是这样的数据, 要设计个表, 查询出来也是这样的结果, 我设计的表, VariableCode ID VariableName 名称 PVariableCode PID VariableFullName 变量名称[/quote] 再加一列级别可以吗?[/quote] 可以的, 这个看自己设计, 然后sql查询的结果,能跟这个Excel展示的一样就可以
二月十六 2018-07-13
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuaidan1988 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]
描述 级别 变量代码

Excel就是这样的数据, 要设计个表, 查询出来也是这样的结果,

我设计的表,
VariableCode ID
VariableName 名称
PVariableCode PID
VariableFullName 变量名称[/quote]
再加一列级别可以吗?
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
描述 级别 变量代码

VariableId	VariableCode	VariableName	PVariableCode	  PVariableName	VariableFullName
1	                        100	                因变量	           0	             NULL	                  NULL
2	                     100100	   统计局口径	        100	              NULL	                  NULL
3	                    100100100	汽油表观消费量 	100100	     NULL                   ytq
4	                       101	           车辆变量	           0	             NULL                   NULL
5	                      101100	  汽油车	                 101              NULL	                NULL
6	                    101100100	      保有量	         101100	      NULL           	NULL
7	                  101100100100	标准车	         101100100	NULL         	cqb0
我是这样设计的,但是查询递归出来, 不知道是不是要行转列,
Persistence_x 2018-07-13
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
描述 级别 变量代码
Excel就是这样的数据, 要设计个表, 查询出来也是这样的结果, 我设计的表, VariableCode ID VariableName 名称 PVariableCode PID VariableFullName 变量名称
二月十六 2018-07-13
  • 打赏
  • 举报
回复
描述 级别 变量代码
二月十六 2018-07-13
  • 打赏
  • 举报
回复
那个查询结果是什么?怎么查询出来的?变量代码呢?

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧