表aid   上级id  部门名称
1       0         办公室
2       1         行政科
3       2         卫生室
4       2          门卫         
5       4          前门岗
表b
id   得分
3       1
5       2现在想得到的结果是
id   部门    得分
1   办公室   3  (1+2)如何写语句?

解决方案 »

  1.   


    IF OBJECT_ID(N'表a') IS NOT NULL
    DROP TABLE [表a]
    GO
    CREATE TABLE [表a](id INT,上级id INT,部门名称 VARCHAR(10))
    INSERT INTO [表a]
    SELECT 1,0,'办公室'
    UNION ALL  SELECT 2,1, '行政科'
    UNION ALL  SELECT 3,2,'卫生室'
    UNION ALL  SELECT 4,2,'门卫'         
    UNION ALL  SELECT 5,4,'前门岗'IF OBJECT_ID(N'表b') IS NOT NULL
    DROP TABLE [表b]
    GO
    CREATE TABLE [表b](id INT,得分 INT)
    INSERT INTO [表b]
    SELECT 3,1 UNION ALL  SELECT 5,2
    ----------------------------------------------统计----------------------------------------------
    DECLARE @id AS INT
    SET @id=1 --id为部门名称ID,可以根据统计需要设置
    ;WITH t AS 

    SELECT id,上级id,部门名称 FROM [表a]  WHERE id=@id  
    UNION ALL
    SELECT   a.id,a.上级id,a.部门名称 FROM [表a]  a
    INNER JOIN  t b ON a.上级id=b.id

    SELECT   @id AS ID,(SELECT 部门名称 FROM [表a] WHERE id=@id) 部门名称 , sum(得分) 得分 FROM t a,[表b] b WHERE a.id=b.id
     
     /*
    ID          部门名称       得分
    ----------- ---------- -----------
    1           办公室        3(1 行受影响) 
     */
     
      

  2.   

    我想建立一个clr 的自定义标量值函数,无法调用他啊,是不是权限没设置好。
      

  3.   


    怎么无法调用?select dbo.functionName()加上架构名架构和角色区别?架构可以看做是数据库内部的逻辑结构,架构下有数据库对象(表,SP,函数,视图)角色就是具体特定权限的组织机构
      

  4.   


    怎么无法调用?select dbo.functionName()加上架构名架构和角色区别?架构可以看做是数据库内部的逻辑结构,架构下有数据库对象(表,SP,函数,视图)角色就是具体特定权限的组织机构是不是说架构的意思是你可以访问哪些东西?比如简单的说表。
    角色的意思是不是说你如何访问这些架构的权限?比如删除,增加。
      

  5.   


    怎么无法调用?select dbo.functionName()加上架构名架构和角色区别?架构可以看做是数据库内部的逻辑结构,架构下有数据库对象(表,SP,函数,视图)角色就是具体特定权限的组织机构是不是说架构的意思是你可以访问哪些东西?比如简单的说表。
    角色的意思是不是说你如何访问这些架构的权限?比如删除,增加。架构是逻辑结构,他包含了很多东西,比如表,视图,函数,存储过程,等等
    就好像是一个省,这个省里建立了很多工业园,工厂等等,这些工业园、工厂是归属于这个省的一个对象归属于某个架构,比如一个表,可以属于dbo架构,或者test架构(假如存在test架构的话)
    意思是某个对象从属于某个架构角色有一定的权限,比如省长这个角色有任命市长的权限
    当A这个人当上省长时,A就具有任命市长的权利了
    当B这个人当上省长是,B也有任命市长的权利(谁在这个位置上做,谁就有角色拥有的这个权限)
      

  6.   


    怎么无法调用?select dbo.functionName()加上架构名架构和角色区别?架构可以看做是数据库内部的逻辑结构,架构下有数据库对象(表,SP,函数,视图)角色就是具体特定权限的组织机构是不是说架构的意思是你可以访问哪些东西?比如简单的说表。
    角色的意思是不是说你如何访问这些架构的权限?比如删除,增加。架构是逻辑结构,他包含了很多东西,比如表,视图,函数,存储过程,等等
    就好像是一个省,这个省里建立了很多工业园,工厂等等,这些工业园、工厂是归属于这个省的一个对象归属于某个架构,比如一个表,可以属于dbo架构,或者test架构(假如存在test架构的话)
    意思是某个对象从属于某个架构角色有一定的权限,比如省长这个角色有任命市长的权限
    当A这个人当上省长时,A就具有任命市长的权利了
    当B这个人当上省长是,B也有任命市长的权利(谁在这个位置上做,谁就有角色拥有的这个权限)
    谢谢。
      

  7.   

    折腾两天,总算做出来了,粘代码在这里以备以后查看。
    IF EXISTS ( SELECT  *
                FROM    sysobjects
                WHERE   xtype IN ( 'FN', 'IF', 'TF' )
                        AND name = 'Fun_指标分类得分'
               )
    begin                    
         drop  Function  Fun_指标分类得分
    end
    go
    CREATE FUNCTION Fun_指标分类得分(@指标序号 int,@员工代码 int )
    RETURNS TABLE
    AS 
    RETURN
    (
    WITH t AS 
    (  
    SELECT 指标序号,指标名称,上级指标,指标简码,分数 FROM 绩效管理_考核指标 zja
         WHERE 指标序号=@指标序号   
    UNION ALL
    SELECT zjb.指标序号,zjb.指标名称,zjb.上级指标,zjb.指标简码,zjb.分数  FROM 绩效管理_考核指标 zjb
    INNER JOIN  t b ON zjb.上级指标 =b.指标简码 
    )  
    SELECT  @指标序号 as 指标序号,
           (select 指标名称 from 绩效管理_考核指标 where 指标序号=@指标序号) as 指标名称,
           isnull(sum(kkb.次数*a.分数),0) as 得分  FROM t a
           inner join 绩效管理_考核列表 kkb on a.指标序号=kkb.指标项 
           where kkb.被考核人=@员工代码

    go    declare @fl_field nvarchar(4)  
        declare @计数 int
        set @计数=1
        declare Temp_Table cursor for
            select 指标序号 from 绩效管理_考核指标 where 级数=@级数
        open Temp_Table fetch next from Temp_Table into @fl_field
        while @@fetch_status = 0
          begin
             if (@计数<=1)
                SELECT * into ##dtbl_绩效_总分_临时表 from Fun_指标分类得分(@fl_field,@员工代码)
             else
                insert into ##dtbl_绩效_总分_临时表 select * from Fun_指标分类得分(@fl_field,@员工代码)
             set @计数=@计数+1
             fetch next from Temp_Table into @fl_field
          end
        select qz.指标序号,ls.指标名称,ls.得分,qz.权重分数 from ##dtbl_绩效_总分_临时表 as ls
           inner join 绩效管理_绩效权重 qz on ls.指标序号=qz.指标序号 
           where 年份=datepart(year,getdate()) and 权重分组=@权重分组
        drop table ##dtbl_绩效_总分_临时表   
        close Temp_Table
        deallocate Temp_Table
    基本的套路是先做一个表值函数,然后建一个游标,反复调用这个表值函数,再将得到的结果放到一个临时表中,
    最后从临时表中得到数据。
    得出的经验就是要会用临时表,一味的inner join 之类的来获取数据不可承,
    同样的实验数据,一味的inner join得到的结果花了16秒到17秒,
    而使用临时表花费不到1秒时间。
      

  8.   

      DECLARE @id AS INT
    SET @id=1 
       SELECT    @id AS ID,(SELECT 部门名称 FROM [表a] WHERE id= @id) 部门名称 ,
        sum(得分) 得分 
        FROM [表a] a,[表b] b 
        WHERE a.id=b.id 
    一样结果