依米流沙
2021-09-29 12:29
采纳率: 80%
浏览 116

第三题和第四题 求解 加急

img

img

  • 好问题 提建议
  • 收藏

2条回答 默认 最新

  • 神仙别闹 2021-09-29 13:07
    已采纳

    这是第三题的大概解题思路,中文名称全部换成实际的表名和列明即可。

    create procedure 存储过程名称
    @Number nvarchar(50) --员工编号
    as
    begin
        declare @CountNumber as varchar(10),@name as varchar(50), @time as datetime,@message as varchar(100)
        
        select @CountNumber=COUNT(*) from 员工表 where 员工编号=@Number and 部门<>10 and 入职时间 > (select top 1 入职时间 from 员工表 where 部门=10 order by 入职时间 desc)
        if @CountNumber>0--输出员工、入职时间
            begin
            select @name=员工姓名,@time=入职时间 from 员工表 where 员工编号=@Number
            print '员工姓名:'+@name+' 入职时间:'+@time
            end
        else--员工保存在
            begin
            set @message= '员工编号不存在'
            print '结果:'+@message
            end
    end
    

    这是第四题的思路

    --第一种循环:利用游标循环
    declare  @id int,@value nvarchar(100);
    begin
        declare c_test_main cursor fast_forward for select 员工姓名,工资  from  emp;--查出需要的集合放到游标中
        open c_test_main;--打开游标
        while 1=1 --开始循环
        begin
            fetch next from c_test_main into @id,@value; --赋值到变量中
            if(@@fetch_status!=0)break;--如果没有结果退出循环
            if @value<1200
                begin 
                    print '员工:'+@id+'该加工资了'
                end
            else if @value>=1200 and @value<2100
                begin
                    print '员工:'+@id+'还行'
                end
            else
                begin
                print '员工:'+@id+'有钱人'
                end
        end
        close c_test_main    --关闭游标
        deallocate c_test_main    --释放游标
    end
    go
    --第二种循环:特定ID循环,类似For循环
    declare @max int
    declare @i int
    select ROW_NUMBER() over (order by id) as 'Id',员工姓名,工资 into #temp from emp
    select @max=max(Id) from #temp
    set @i = 1
    while (@i <= @max)
        begin
            begin
                declare @name int
                declare @money int
                select @name=员工姓名,@money=工资 from #temp where ID = @i
                if @money<1200
                begin 
                    print '员工:'+@name+'该加工资了'
                    break
                end
                else if @money>=1200 and @money<2100
                begin
                    print '员工:'+@name+'还行'
                    break
                end
                else
                begin
                    print '员工:'+@name+'有钱人'
                    break
                end
                
                
            end
            set @i = @i + 1
        end
    go
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • riabai 2021-09-29 16:14

    第3题:
    1、创建员工表,插入数据

    -- ----------------------------
    -- Table structure for emp_info
    -- ----------------------------
    DROP TABLE IF EXISTS `emp_info`;
    CREATE TABLE `emp_info`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `emp_no` int(11) NULL DEFAULT NULL,
      `emp_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `dept_no` int(2) NULL DEFAULT NULL,
      `hiredate` date NULL DEFAULT NULL,
      `salary` int(10) NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of emp_info
    -- ----------------------------
    INSERT INTO `emp_info` VALUES (1, 1001, '张三', 10, '2021-08-10', 1000);
    INSERT INTO `emp_info` VALUES (2, 1002, '李四', 10, '2021-08-20', 1200);
    INSERT INTO `emp_info` VALUES (3, 1003, '王五', 10, '2021-08-30', 1500);
    INSERT INTO `emp_info` VALUES (4, 1004, '赵六', 20, '2021-07-29', 1800);
    INSERT INTO `emp_info` VALUES (5, 1005, '田七', 20, '2021-09-29', 2500);
    
    

    2、编写存储过程

    drop PROCEDURE if EXISTS proc_emp;
    delimiter //
    CREATE PROCEDURE proc_emp (IN empNo INT )
    begin
        declare empCount INT;#条件:员工编号
        declare empCountCondition INT;#条件:员工编号、不是10部门的员工、入职日期比任何一个10部门员工晚
            declare empName varchar(10);
          declare    empHiredate date;
            declare    message varchar(10);
            select COUNT(*) into empCount from emp_info where emp_no=empNo;
        if empCount=0 then
                    set message= '员工编号不存在';
            select message as '结果';
        else 
          select COUNT(*),emp_name,hiredate into empCountCondition,empName,empHiredate from emp_info where emp_no=empNo and dept_no<>10 and hiredate > (select max(hiredate) from emp_info where dept_no=10);
                if empCountCondition>0 then
                    select empName as '员工姓名',empHiredate as '入职时间';    
                else
                    select NULL as '结果';
                end if;
            end if;
    end //
    delimiter ;
    
    
    
    

    3、执行存储过程
    call(1000); --不存在
    call(1001);--1001、1002、1003输出NULL
    call(1004);输出NULL
    call(1005);输出名字,入职日期
    第4题
    接着第三题继续
    1、编写存储过程:

    drop procedure if EXISTS evaluate_salary;
    
    delimiter //
    create procedure evaluate_salary()
    begin
    
    select 
        emp_name,
        (case 
            when (salary<1200) then '该加工资了'
            when (salary>=1200 and salary<2100) then '还行'
    --         else 'NB'
        end) as '工资评价'
        from emp_info;
    end //
    
    delimiter;
    
    call evaluate_salary();
    
    ```sql
    
    
    
    2、调用存储过程
    call evaluate_salary();
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题