haynes 2015-09-22 08:29 采纳率: 100%
浏览 1684
已采纳

MS SQL 复杂数据库设计,行和列都是动态的。最终生成一个SELECT

图片说明

想要实现上图中的效果,尺码与颜色都是动态的。

我自己设计的数据表

尺码db_cm

尺码ID 订单ID 尺码名称

颜色DB_YS

颜色ID 订单ID 颜色名称

数量DB_SL

数量ID 订单ID 尺码 颜色 数量 备注

3个表有个共同的关键字 订单ID

现在想实现图片中的效果,SQL应该怎么写?我用的是MS SQL2000
如果数据表设计不合理,那应该怎么设计?

  • 写回答

5条回答 默认 最新

  • LongRui888 2015-09-25 02:26
    关注

    大概就是这样的:

    在论坛中出现的比较难的sql问题:6(行转列问题1)

     数据查询,行转列的问题。
    http://bbs.csdn.net/topics/390621630?page=1#post-395855019
    
    根据数据查询得到如下数据表(tab):
    班级           学号     姓名        科目             得分          班排名       校排名         标准分
    ClassName  Code  Name  SubjectName TotalScore ClassRank SchoolRank TValue
    201班        101     张三      语文               95             1                 1           700
    201班        102     李四      语文               83             2                 3           600
    202班        201     张飞      语文               85             1                 2           700
    202班        202     赵云      语文               75             2                 4           600
    
    201班        101     张三      数学               83             2                 2           600
    201班        102     李四      数学               85             1                 3           700
    202班        201     张飞      数学               95             1                 1           700
    202班        202     赵云      数学               80             2                 4           600
    
    需要得到如下数据:
    班级           学号     姓名    语文   得分  班排名  校排名  标准分 数学   得分  班排名    校排名    标准分
    201班        101     张三      语文     95       1        1       700       数学    83        2                 2           600
    201班        102     李四      语文     83       2        3       600       数学    85        1                 3           700
    202班        201     张飞      语文     85       1        2       700       数学    95        1                 1           700
    202班        202     赵云      语文     75       2        4       600       数学    80        2                 4           600
    
    真心求SQL,或者实现方法。
    科目是动态的。能实现静态转换也行。
    真心谢谢。
    
    我的解法:
    [sql] view plaincopy
    if object_id('tab') is not null drop table tab  
    go   
    create table tab  
    (  
    [班级] varchar(9),[学号] varchar(4),[姓名] varchar(4),  
    [科目] varchar(11),[得分] varchar(10),[班排名] varchar(9),  
    [校排名] varchar(10),[标准分] varchar(6)  
    )  
    
    insert tab  
    select '201班','101','张三','语文','95','1','1','700' union all  
    select '201班','102','李四','语文','83','2','3','600' union all  
    select '202班','201','张飞','语文','85','1','2','700' union all  
    select '202班','202','赵云','语文','75','2','4','600' union all  
    select '201班','101','张三','数学','83','2','2','600' union all  
    select '201班','102','李四','数学','85','1','3','700' union all  
    select '202班','201','张飞','数学','95','1','1','700' union all  
    select '202班','202','赵云','数学','80','2','4','600'  
    --------------开始查询--------------------------  
    
    
    declare @sql nvarchar(3000);  
    
    set @sql = '';  
    
    select @sql =   
       @sql + ',min(case when 科目=''' + 科目 + ''' then 科目 else null end) as ['+科目+ ']'+  
              ',min(case when 科目=''' + 科目 + ''' then 得分 else null end) as 得分' +  
              ',min(case when 科目=''' + 科目 + ''' then 班排名 else null end) as 班排名'+  
              ',min(case when 科目=''' + 科目 + ''' then 校排名 else null end) as 校排名'+  
              ',min(case when 科目=''' + 科目 + ''' then 标准分 else null end) as 标准分'  
    
    from tab  
    group by 科目  
    order by 科目 desc  
    
    select @sql = 'select 班级,学号,姓名'+@sql +  
                  ' from tab group by 班级,学号,姓名'  
    
    select @sql         
    exec(@sql)         
    /*  
    班级        学号   姓名   语文          得分         班排名       校排名        标准分    数学          得分         班排名       校排名        标准分  
    --------- ---- ---- ----------- ---------- --------- ---------- ------ ----------- ---------- --------- ---------- ------  
    201班      101  张三   语文          95         1         1          700    数学          83         2         2          600  
    201班      102  李四   语文          83         2         3          600    数学          85         1         3          700  
    202班      201  张飞   语文          85         1         2          700    数学          95         1         1          700  
    202班      202  赵云   语文          75         2         4          600    数学          80         2         4          600  
    警告: 聚合或其他 SET 操作消除了 Null 值。  
    
    */  
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算