交叉多栏

时间:2012-08-15 15:30:48

标签: sql sql-server sql-server-2008 tsql 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

请访问此网址以测试此SQL:http://sqlfiddle.com/#!3/196c6/1

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

当一个简单的分组足够时,我不喜欢做外连接:

select max(case when semester = 1 then Name end) as name1,
       max(case when semester = 1 then credit end) as credit1,
       max(case when semester = 1 then year end) as year1,
       max(case when semester = 1 then semester end) as semester1,
       max(case when semester = 2 then Name end) as name2,
       max(case when semester = 2 then credit end) as credit2,
       max(case when semester = 2 then year end) as year2,
       max(case when semester = 2 then semester end) as semester2
from (select t.*,
             row_number() over (partition by semester order by name) as rownum
      from t
     ) t2
group by rownum
order by rownum

答案 2 :(得分:0)

select Name,credit, grade, year,semester from myTable
group by semester,year, Name,credit, grade;

现在我们必须使用此前一个查询进行动态查询: 创建为临时表,因为首先有semster 动态创建一个包含循环中所有学期表的所有字段的选择查询: foreach临时表在select查询中连接此表的所有字段 并添加具有此表的学期值的构造标签字段 并添加带联合的临时表

'select'+#tbls1.fieldName +','+ ... + +#tbls2.fieldName +