1

我在 SQL Server 2008 中有一个像这样的表:

st_id   st_rollno  st_name  subject  Theory      Total   Lab      Total
--------------------------------------------------------------------------------
086001  IT001      PRANAV   mat        21           22       11       14
086002  IT002      DEEP     mat        21           22       11       14
086001  IT001      PRANAV   sci        20           24       09       12
086002  IT002      DEEP     sci        21           24       08       12

我希望我的输出如下,使用 SQL Server 2008 功能,如果有任何 1 可以帮助我..?

st_id   st_rollno   st_name   subject   Theory   Total            Lab      Total
---------------------------------------------------------------------------------------
086001  IT001      PRANAV   mat,sci 21,20       22,24          11,09       14,12
086002  IT002       DEEP    mat,sci 21,21       22 ,24         11,08       14,12
4

2 回答 2

1

SQL小提琴

MS SQL Server 2008 架构设置

create table YourTable
(
  st_id varchar(6),
  st_rollno varchar(5),
  st_name varchar(6),
  subject varchar(3),
  Theory int,
  Total1 int,
  Lab int,
  Total2 int
)

insert into YourTable values
('086001',  'IT001',      'PRANAV',   'mat',        21,           22,       11,       14),
('086002',  'IT002',      'DEEP  ',   'mat',        21,           22,       11,       14),
('086001',  'IT001',      'PRANAV',   'sci',        20,           24,       09,       12),
('086002',  'IT002',      'DEEP  ',   'sci',        21,           24,       08,       12)

查询 1

select T1.st_id,
       T1.st_rollno,
       T1.st_name,
       stuff(T3.X.query('subject').value('.', 'varchar(max)'), 1, 1, '') as subject,
       stuff(T3.X.query('Theory').value('.', 'varchar(max)'), 1, 1, '') as theory,
       stuff(T3.X.query('Total1').value('.', 'varchar(max)'), 1, 1, '') as Total1,
       stuff(T3.X.query('Lab').value('.', 'varchar(max)'), 1, 1, '') as Lab,
       stuff(T3.X.query('Total2').value('.', 'varchar(max)'), 1, 1, '') as Total2
from (
     select st_id, st_rollno, st_name
     from YourTable
     group by st_id, st_rollno, st_name
     ) as T1
cross apply 
     (
     select  ','+T2.subject                     as subject,
             ','+cast(T2.Theory as varchar(10)) as Theory,
             ','+cast(T2.Total1 as varchar(10)) as Total1,
             ','+cast(T2.Lab    as varchar(10)) as Lab,
             ','+cast(T2.Total2 as varchar(10)) as Total2
     from YourTable as T2
     where T1.st_id = T2.st_id and
           T1.st_name = T2.st_name and
           T1.st_rollno = T2.st_rollno
     for xml path(''), type
     ) as T3(X)

结果

|  ST_ID | ST_ROLLNO | ST_NAME | SUBJECT | THEORY | TOTAL1 |  LAB | TOTAL2 |
----------------------------------------------------------------------------
| 086001 |     IT001 |  PRANAV | mat,sci |  21,20 |  22,24 | 11,9 |  14,12 |
| 086002 |     IT002 |  DEEP   | mat,sci |  21,21 |  22,24 | 11,8 |  14,12 |
于 2013-01-28T06:40:12.387 回答
0

改编自这里:SQL Server Concatenate GROUP BY你正在寻找这样的东西:

SELECT 
 st_id, st_rollno, st_name,
 STUFF
 (
    (
        SELECT 
            ',' +subject  
        FROM
            yourtable
        WHERE
            yourtable.st_id=st_id
        FOR XML PATH('')
    )
,1,1,'') AS subject, 

...

FROM yourtable

这里要理解的核心概念是stufffor xml我的语法不太正确,但如果没有其他人发帖,这应该会让你走上正确的道路。当我靠近 SSMS 并可以测试时,我会更新这个。这绝对是可行的。我发现在 MySQL 中使用 Group_Concat 更容易。

于 2013-01-28T05:57:29.693 回答