作者RichFU (小富哥~~~)
看板Database
标题Re: [SQL ] 问题 资料表横向展示,但资料内容重覆时...
时间Fri Sep 3 23:39:26 2010
※ 引述《wellwind (..)》之铭言:
: 各位前辈好
: 小弟目前正在设计一个成绩排名系统
: 排名资料库格式大概如下
: 组别 学号 排名
: 001 00101 1
: 001 00103 2
: 001 00110 3
: 002 00204 1
: 002 00205 2
: 002 00214 3
: 目前是可以用类似下面的语法转成横向显示
: SELECT [组别],
: MAX([学号1]) AS [第一名学号],
: MAX([学号2]) AS [第二名学号],
: MAX([学号3]) AS [第三名学号]
: FROM(
: SELECT [组别],
: CASE [排名] WHEN 1 THEN [学号] END AS [学号1],
: CASE [排名] WHEN 2 THEN [学号] END AS [学号2],
: CASE [排名] WHEN 3 THEN [学号] END AS [学号3]
: FROM score_tbl
: ) AS tbl2
: GROUP BY [组别]
: 查出来的表会变成这样
: 组别 第一名学号 第二名学号 第三名学号
: 001 00101 00103 00110
: 002 00204 00205 00214
: 不过这样没有版法除里相同排名的问题,例如同时是第一名,
: 或第四名跟第三名同分并列第三时,希望可以像这样排
: 组别 第一名学号 第二名学号 第三名学号
: 001 00101 NULL 00110
: 001 00103 NULL NULL
: (00101,00103并列第一,所以00110是第三名)
: 002 00204 00205 00214
: 002 NULL NULL 00215
: (00214,00215并列第三,所以虽然是取前三名,但实际上有四名)
: 遇到这样的要求,目前脑袋是一片空白,想请问各位该如何做这样的查询?
: 资料库是SQL Server 2005
试试这样可以吗?
SELECT [虚拟编号],[组别],
MAX([第一名学号]), MAX([排名1]),
MAX([第二名学号]), MAX([排名2]),
MAX([第三名学号]), MAX([排名3])
FROM (
SELECT ROW_NUMBER() OVER (PARITION BY [组别],[排名1],[排名2],[排名3] ) AS [虚拟编号],
[组别],
[第一名学号],[排名1],
[第二名学号],[排名2],
[第三名学号],[排名3]
FROM (
SELECT [组别],
CASE [排名] WHEN 1 THEN [学号] END AS [第一名学号],
CASE [排名] WHEN 1 THEN [排名] END AS [排名1],
CASE [排名] WHEN 2 THEN [学号] END AS [第二名学号],
CASE [排名] WHEN 2 THEN [排名] END AS [排名2],
CASE [排名] WHEN 3 THEN [学号] END AS [第三名学号] CASE [排名] WHEN 3 THEN [排名] END AS [排名3],
FROM score_tbl )
) T_TMP
GROUP BGY [虚拟编号],[组别];
第二层T_TMP的结果:
虚拟编号 组别 第一名学号 排名1 第二名学号 排名2 第三名学号 排名3
1 1 101 1
2 1 103 1
1 1 110 3
1 2 204 1
1 2 205 2
1 2 214 3
2 2 215 3
最终结果:
虚拟编号 组别 第一名学号 排名1 第二名学号 排名2 第三名学号 排名3
1 1 101 1 110 3
2 1 103 1
1 2 204 1 205 2 214 3
2 2 215 3
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.240.166.244