首页 > 其他 > 详细

存储过程实现树形目录外联其他表实现每个节点的统计

时间:2019-07-08 11:49:45      阅读:104      评论:0      收藏:0      [点我收藏+]

树结构表

USE [DEMO]
GO

/****** Object:  Table [dbo].[Design_DrawingData]    Script Date: 07/05/2019 18:13:38 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Design_DrawingData](
    [DrawingId] [int] IDENTITY(1,1) NOT NULL,
    [DrawingCode] [varchar](200) NOT NULL,
    [ProjectId] [int] NOT NULL,
    [DrawingName] [varchar](500) NULL,
    [ParentDrawingId] [varchar](200) NOT NULL,
    [DrawingLeave] [int] NULL,
    [DrawingOrder] [int] NULL,
    [CommitStartTime] [datetime] NULL,
    [CommitEndTime] [datetime] NULL,
    [AddUserId] [int] NOT NULL,
    [UpdateTime] [datetime] NULL,
    [FilePath] [varchar](500) NULL,
    [Note] [varchar](max) NULL,
    [BgColor] [varchar](50) NULL,
    [FgColor] [varchar](50) NULL,
    [Other] [varchar](max) NULL,
 CONSTRAINT [PK_DESIGN_DRAWINGDATA] PRIMARY KEY CLUSTERED 
(
    [DrawingId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N图纸唯一主键 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NDrawingId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N层级编号 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NDrawingCode
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N项目id , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NProjectId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N层级名称 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NDrawingName
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N所属父级层级编号(根级为0) , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NParentDrawingId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N目录层级(根级为0) , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NDrawingLeave
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N层级排序 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NDrawingOrder
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N交付开始时间 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NCommitStartTime
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N交付结束时间 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NCommitEndTime
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N创建人ID , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NAddUserId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N更新时间 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NUpdateTime
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N图纸路径 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NFilePath
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N备注 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NNote
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N节点背景色 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NBgColor
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N节点字体色 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NFgColor
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N备用字段 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData, @level2type=NCOLUMN,@level2name=NOther
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N设计管理_图纸管理 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NDesign_DrawingData
GO

外键表

USE [DEMO]
GO
DROP TABLE [dbo].[Advice_Problem] 
/****** Object:  Table [dbo].[Advice_Problem]    Script Date: 07/03/2019 15:25:01 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Advice_Problem](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DrawingId] [int] NULL,
    [ProblemType] [varchar](500) NULL,
    [ProblemCount] [int] NOT NULL,
    [Other] [varchar](max) NULL,
    [ProjectId] [int] NULL,
 CONSTRAINT [PK_Advice_Problem] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N图纸ID , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem, @level2type=NCOLUMN,@level2name=NDrawingId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N问题种类 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem, @level2type=NCOLUMN,@level2name=NProblemType
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N问题数量 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem, @level2type=NCOLUMN,@level2name=NProblemCount
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N备用 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem, @level2type=NCOLUMN,@level2name=NOther
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N项目Id , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem, @level2type=NCOLUMN,@level2name=NProjectId
GO

EXEC sys.sp_addextendedproperty @name=NMS_Description, @value=N咨询管理 , @level0type=NSCHEMA,@level0name=Ndbo, @level1type=NTABLE,@level1name=NAdvice_Problem
GO

ALTER TABLE [dbo].[Advice_Problem] ADD  CONSTRAINT [DF_Advice_Problem_ProblemCount]  DEFAULT ((0)) FOR [ProblemCount]
GO

存储过程

USE [DEMO]
GO
/****** Object:  StoredProcedure [dbo].[Report_DesignDrawing]    Script Date: 07/03/2019 15:27:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        <Author,YFH>
-- Create date: <Create Date,2017.09.16>
-- Description:    <Description,设计问题统计>
-- =============================================
CREATE PROC [dbo].[Report_DesignDrawing]
( 
 @projectId int,--项目id
 @keyWords Varchar(50)--搜索关键字
)
AS 
BEGIN 
  
    create table #temptb --创建临时表,列名最好与树目录列对应
    (
       Id int identity(1,1) not null,
       DrawingId int,
       DrawingCode varchar(200),
       DrawingName varchar(200),
       DrawingLeave int,
       ParentDrawingId int
    );
    --动态创建列,用于统计页面除主要字段其他统计字段数量不确定的情况,其他情况直接创建静态列
    declare @sql as varchar(1000)
    declare @sqlupdate as varchar(1000)
    declare @i as int
    declare @count as varchar(2)
    set @i = 1
    set @count = (select count(distinct(ProblemType)) from dbo.Advice_Problem where ProjectId=@projectId)
    while @i <= @count 
    begin
     SET @sql = ALTER TABLE #temptb ADD [P+ convert(varchar(10),@i) +] NVARCHAR(100) NULL
     execute (@sql)
     set @i = @i + 1
    end
    
    if @keyWords is null or @keyWords=‘‘ --判断搜索参数是否为空
        begin
            WITH TEMP AS
            (
            SELECT * FROM Design_DrawingData WHERE ProjectId=@projectId and DrawingId=(select min(DrawingId) from Design_DrawingData where ProjectId=@projectId)
            UNION ALL
            SELECT T0.* FROM TEMP,Design_DrawingData T0 WHERE TEMP.DrawingId=T0.ParentDrawingId
            )
            insert into #temptb(DrawingId,DrawingCode,DrawingName,DrawingLeave,ParentDrawingId) 
            SELECT TEMP.DrawingId,TEMP.DrawingCode,TEMP.DrawingName,TEMP.DrawingLeave,TEMP.ParentDrawingId FROM TEMP;
        end
    else
        begin
           WITH TEMP AS
            (
            SELECT * FROM Design_DrawingData WHERE ProjectId=1 and  (DrawingName like %+@keyWords+‘‘ or DrawingCode like %+@keyWords+‘‘)
            UNION ALL
            SELECT T0.* FROM TEMP,Design_DrawingData T0 WHERE TEMP.DrawingId=T0.ParentDrawingId
            )
            insert into #temptb(DrawingId,DrawingCode,DrawingName,DrawingLeave,ParentDrawingId) 
            SELECT distinct(TEMP.DrawingId),TEMP.DrawingCode,TEMP.DrawingName,TEMP.DrawingLeave,TEMP.ParentDrawingId FROM TEMP where DrawingLeave<6;
        end
    
    --定义循环时临时变量
    Declare @total  int
    Declare @currentIndex int
    Declare @totalRows    int
    Declare @DrawingId  int
    select @currentIndex=1
    select @totalRows=count(1) from #temptb
    
    while(@currentIndex<=@totalRows) --循环每一个树节点
       begin
          select @DrawingId= DrawingId from #temptb where id=@currentIndex;
            WITH TEMP AS
            (
            SELECT * FROM Design_DrawingData WHERE DrawingId=@DrawingId
            UNION ALL
            SELECT T0.* FROM TEMP,Design_DrawingData T0 WHERE TEMP.DrawingId=T0.ParentDrawingId
            )
            select @total =(select COUNT(1) from TEMP)
            set @i=1
            while @i <= @count --循环更新该节点下每个统计列的值,如果统计列固定,则不需要循环
            begin
             SET @sql = update #temptb set P+convert(varchar(10),@i)+=(select ProblemCount from dbo.Advice_Problem as f where f.DrawingId =+convert(varchar(10),@DrawingId)+ and f.ProblemType=‘‘P+convert(varchar(10),@i)+‘‘‘) where DrawingId=+convert(varchar(10),@DrawingId)+‘‘
             execute (@sql)
             SET @sqlupdate = update #temptb set P+convert(varchar(10),@i)+=0 where DrawingId=+convert(varchar(10),@DrawingId)+ and P+convert(varchar(10),@i)+ is null
             execute (@sqlupdate)
             set @i = @i + 1
            end
          select @currentIndex=@currentIndex+1;
       end
       select * from #temptb;
       DROP TABLE #temptb

END 

 

存储过程实现树形目录外联其他表实现每个节点的统计

原文:https://www.cnblogs.com/fengyeqingxiang/p/11150064.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!