如果将表A的数据排列成表B的数据 求教  感谢~~~~~~~~~~~~~~~~~~~~~~~~~~~
表A
班级 科目 张三 李四 王五
1 A 99 89 95
1 B 77 88 90
1 C 80 90 70
..................表B
班级 科目 张三 李四 王五 第1名 第2名 第3名 一二名分差 二三名分差
1 A 99 89 95 张三 王五 李四 4 6
1 B 77 88 90 王五 李四 张三 2 11
1 C 80 90 70 李四 张三 王五 10 10
....................

解决方案 »

  1.   


    WITH a1 (班级,科目,张三,李四,王五) AS
    (
    SELECT 1,'A',99,89,95 UNION ALL
    SELECT 1,'B',77,88,90 UNION ALL
    SELECT 1,'C',80,90,70
    )
    ,a2 AS
    (
    SELECT *,
    CASE 
    WHEN 张三>李四 AND 张三>王五 THEN 张三
    WHEN 李四>张三 AND 李四>王五 THEN 李四
    ELSE 王五
    END 第1名,
    CASE 
    WHEN NOT ((张三>李四 AND 张三>王五) OR (张三<李四 AND 张三<王五)) THEN 张三
    WHEN NOT ((李四>张三 AND 李四>王五) OR (李四<张三 AND 李四<王五)) THEN 李四
    ELSE 王五
    END 第2名,
    CASE 
    WHEN 张三<李四 AND 张三<王五 THEN 张三
    WHEN 李四<张三 AND 李四<王五 THEN 李四
    ELSE 王五
    END 第3名
    from a1
    )
    SELECT *,第1名-第2名 一二名分差,第2名-第3名 二三名分差
    FROM a2
      

  2.   

    感谢回复  但是我要显示的名字,
    班级 科目 张三 李四 王五 第1名 第2名 第3名 一二名分差 二三名分差
    1 A 99 89 95 张三 王五 李四 4 6
    1 B 77 88 90 王五 李四 张三 2 11
    1 C 80 90 70 李四 张三 王五 10 10现在结果显示出来的是数值班级 科目 张三 李四 王五 第1名 第2名 第3名 一二名分差 二三名分差
    1 A 99 89 95 99 95 89 4 6
    1 B 77 88 90 90 88 77 2 11
    1 C 80 90 70 90 80 70 10 10
      

  3.   


    WITH a1 (班级,科目,张三,李四,王五) AS
    (
    SELECT 1,'A',99,89,95 UNION ALL
    SELECT 1,'B',77,88,90 UNION ALL
    SELECT 1,'C',80,90,70
    )
    ,a2 AS
    (
    SELECT *,
    CASE 
    WHEN 张三>李四 AND 张三>王五 THEN '张三'
    WHEN 李四>张三 AND 李四>王五 THEN '李四'
    ELSE '王五'
    END 第1名,
    CASE 
    WHEN NOT ((张三>李四 AND 张三>王五) OR (张三<李四 AND 张三<王五)) THEN '张三'
    WHEN NOT ((李四>张三 AND 李四>王五) OR (李四<张三 AND 李四<王五)) THEN '李四'
    ELSE '王五'
    END 第2名,
    CASE 
    WHEN 张三<李四 AND 张三<王五 THEN '张三'
    WHEN 李四<张三 AND 李四<王五 THEN '李四'
    ELSE '王五'
    END 第3名,
    CASE 
    WHEN 张三>李四 AND 张三>王五 THEN 张三
    WHEN 李四>张三 AND 李四>王五 THEN 李四
    ELSE 王五
    END 第1名n,
    CASE 
    WHEN NOT ((张三>李四 AND 张三>王五) OR (张三<李四 AND 张三<王五)) THEN 张三
    WHEN NOT ((李四>张三 AND 李四>王五) OR (李四<张三 AND 李四<王五)) THEN 李四
    ELSE 王五
    END 第2名n,
    CASE 
    WHEN 张三<李四 AND 张三<王五 THEN 张三
    WHEN 李四<张三 AND 李四<王五 THEN 李四
    ELSE 王五
    END 第3名n
    from a1
    )
    SELECT 班级,科目,张三,李四,王五,第1名,第2名,第3名,第1名n-第2名n 一二名分差,第2名n-第3名n 二三名分差
    FROM a2
      

  4.   

    相同的时候按照自然顺序排或者随便都行   另外2行好像没什么问题  就是当第一行是  99,99,90的时候,排出来的结果有点问题
    假设数据是
    SELECT 1,'A',99,99,90 UNION ALL
    SELECT 1,'B',77,88,88 UNION ALL
    SELECT 1,'C',70,90,70结果就是
    班级 科目 张三 李四 王五 第1名 第2名 第3名 一二名分差 二三名分差
    1 A 99 99 90 王五 张三 王五 -9 9
    1 B 77 88 88 王五 李四 张三 0 11
    1 C 70 90 70 李四 张三 王五 20 0
      

  5.   


    WITH a1 (班级,科目,张三,李四,王五) AS
    (
    SELECT 1,'A',99,99,95 UNION ALL
    SELECT 1,'B',77,88,88 UNION ALL
    SELECT 1,'C',80,90,70
    )
    ,a2 AS
    (
    SELECT 班级,科目,Sname,分数,ROW_NUMBER() OVER(PARTITION BY 班级,科目 ORDER BY 分数 DESC) re
    from a1 
    unpivot (分数 FOR Sname IN (张三,李四,王五)) t
    )
    SELECT a.*,b.Sname 第1名,c.Sname 第2名,d.Sname 第3名,
    b.分数-c.分数 一二名分差,c.分数-d.分数 二三名分差
    FROM a1 a
    CROSS APPLY (SELECT * FROM a2 WHERE 班级=a.班级 AND 科目=a.科目 AND re=1) b
    CROSS APPLY (SELECT * FROM a2 WHERE 班级=a.班级 AND 科目=a.科目 AND re=2) c
    CROSS APPLY (SELECT * FROM a2 WHERE 班级=a.班级 AND 科目=a.科目 AND re=3) d