如果将表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
....................
表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
....................
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
班级 科目 张三 李四 王五 第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
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
假设数据是
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
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