随、风 2023-09-16 13:30 采纳率: 28.6%
浏览 23
已结题

sql server 转置问题

请教各位。
数据库中我有一个数据表

公司部门人数
A行政部20
A技术部15
A维护部10
B技术部13
B业务部23

希望通过SQL语句,得到以下的结果:

公司部门1部门1人数部门2部门2人数部门3部门3人数
A行政部20技术部15维护部10
B技术部23业务部13NULLNULL

其中列数的多少由原数据表的最大部门数决定。

请教这样应该用怎么样的SQL语句实现?

  • 写回答

2条回答 默认 最新

  • 随、风 2023-09-16 23:29
    关注
    CREATE TABLE Department (
        Company VARCHAR(50),
        DepartmentName VARCHAR(50),
        Number INT
    );
    
    INSERT INTO Department (Company, DepartmentName, Number)
    VALUES ('A', '行政部', 20),
           ('A', '技术部', 15),
           ('A', '维护部', 10),
           ('B', '技术部', 13),
           ('B', '业务部', 23);
    
    
    declare @counts int
    declare @num int
    declare @cols varchar(max)
    declare @query varchar(max)
    set @counts=(  SELECT MAX(num_departments) AS max_depts  
      FROM (  
        SELECT company, COUNT(DISTINCT DepartmentName) AS num_departments  
        FROM [Department]  
        GROUP BY company  
      ) dc );
      set @num=1;
      set @cols='';
      while @num<=@counts
      begin
      set @cols+='MAX(CASE WHEN r = '+cast(@num as varchar)+' THEN DepartmentName END) AS department'+cast(@num as varchar)+',
      MAX(CASE WHEN r = '+cast(@num as varchar)+' THEN num_employees END) AS Number'+cast(@num as varchar)+', '
      set @num+=1;
      end
      select @cols;
      set @cols=(select left(@cols,len(@cols)-1))
    
    set @query='SELECT company,'+@cols+'     
    FROM (  
      SELECT company, DepartmentName, num_employees,  
             ROW_NUMBER() OVER (PARTITION BY company ORDER BY DepartmentName) AS r  
      FROM (
      SELECT company, DepartmentName,max(Number) AS num_employees  
      FROM [Department]   
      GROUP BY company, DepartmentName  
      ) e 
    ) d  
    
    GROUP BY company  
    ORDER BY company; '
    
     exec(@query)
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月24日
  • 已采纳回答 9月16日
  • 修改了问题 9月16日
  • 创建了问题 9月16日

悬赏问题

  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的
  • ¥15 我看了您的文章,遇到了个问题。
  • ¥15 GitHubssh虚拟机连接不上
  • ¥15 装完kali之后下载Google输入法 重启电脑后出现以下状况 且退不出去 桌面消失 反复重启没用
  • ¥15 ESP-IDP-BLE配网连接wifi