sql - 交叉表多列

标签 sql sql-server sql-server-2008 t-sql sql-server-2005

您好,我在 SQL Server 2005 中遇到 SQL 问题。

假设我有一个名为 myTable 的表,其数据如下:

|   NAME | CREDIT | GRADE | YEAR | SEMESTER |
---------------------------------------------
|  Name1 |      1 |     A |    1 |        1 |
|  Name2 |      4 |     B |    1 |        1 |
|  Name3 |      2 |     E |    1 |        1 |
|  Name4 |      7 |     F |    1 |        1 |
|  Name5 |      4 |     A |    1 |        2 |
|  Name6 |      3 |     C |    1 |        2 |
|  Name7 |      6 |     D |    1 |        2 |
|  Name8 |      1 |     A |    1 |        2 |
|  Name9 |      1 |     A |    1 |        2 |
| Name10 |      1 |     A |    1 |        2 |
| Name11 |      3 |     C |    2 |        1 |
| Name12 |      6 |     E |    2 |        1 |
| Name13 |      4 |     C |    2 |        1 |
| Name14 |      2 |     B |    2 |        2 |
| Name15 |      1 |     A |    2 |        2 |
| Name16 |      1 |     A |    2 |        2 |
| Name17 |      1 |     A |    2 |        2 |
| Name18 |      5 |     D |    3 |        1 |
| Name19 |      1 |     A |    3 |        1 |
| Name20 |      1 |     A |    3 |        1 |
| Name18 |      5 |     D |    3 |        2 |
| Name19 |      1 |     A |    3 |        2 |
| Name20 |      1 |     A |    3 |        2 |

我想输出如下结果:

|  NAM1 | CRDT1 | GRD1 | YEAR1 | SEMER1 | NAM2 | CRDT2 | GRD2 | YEAR2 | SEMES2 |
   -----------------------------------------------------------------------------
|  Name1|     1 |    A |     1 |      1 |Name5 |     4 |    A |     1 |      2 |
|  Name2|     4 |    B |     1 |      1 |Name6 |     3 |    C |     1 |      2 |
|  Name3|     2 |    E |     1 |      1 |Name7 |     6 |    D |     1 |      2 |
|  Name4|     7 |    F |     1 |      1 |Name8 |     1 |    A |     1 |      2 |
                                        |Name9 |     1 |    A |     1 |      2 |
                                        |Name10|     1 |    A |     1 |      2 |
| Name11|    3 |     C |     2 |      1 |Name14|     2 |    B |     2 |      2 |
| Name12|    6 |     E |     2 |      1 |Name15|     1 |    A |     2 |      2 |
| Name13|    4 |     C |     2 |      1 |Name16|     1 |    A |     2 |      2 |
                                        |Name17|     1 |    A |     2 |      2 | 
| Name18|    5 |     D |     3 |      1 |Name18|     5 |    D |     3 |      2 |
| Name19|    1 |     A |     3 |      1 |Name19|     1 |    A |     3 |      2 |
| Name20|    1 |     A |     3 |      1 |Name20|     1 |    A |     3 |      2 |   

哪里

- Nam1= Name in Semester 1
- CRDT1= Credit in Semester 1
- GRD1= Grade in Semester 1
- Year1= Year in Semester 1 
- Semer1 = Semester in Semester 1

- Nam2= Name in Semester 2
- CRDT2= Credit in Semester 2
- GRD2= Grade in Semester 2
- Year2= Year in Semester 2 
- Semer2 = Semester in Semester 2

请转到此 URL 来测试此 SQL:http://sqlfiddle.com/#!3/196c6/1

如何创建 SQL 来生成这样的输出?

最佳答案

select
    s1.Name as nam1, s1.credit as crdt1, s1.Year as year1, s1.semester as semer1,
    s2.Name as nam2, s2.credit as crdt2, s2.Year as year2, s2.semester as semer2
from 
(select *, ROW_NUMBER() over (partition by year order by name) rn from myTable where semester=1 ) s1
    full outer join
(select *, ROW_NUMBER() over (partition by year order by name) rn from myTable where semester=2 ) s2
    on s1.year = s2.year
    and s1.rn = s2.rn

关于sql - 交叉表多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972350/

相关文章:

sql-server-2008 - 级联删除和更新的优点和缺点是什么?

sql - 帮助 SQL 查询——需要总和最高的字段

PHP。如何从 2 个 mysql 表而不是 1 个表中获取数据

sql - 获取 2 个提供日期之间的所有年份

sql-server - 在连接关闭的情况下在 SQL Server 上保持事务打开

SQL Server 数据库名称引用

sql-server-2008 - 由于名称中的点,SSIS 包未导入 SS2008

sql - BigQuery 在标准模式下使用 regex_extract_all 选择别名

sql - 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?

sql - T-SQL 包含所有行 ID 的最少公共(public)日期集