繁体   English   中英

SQL Server 游标从不同的表中提取数据并合并相同的行

[英]SQL Server cursor to pull data from different tables and merge the same lines

我正在使用 SQL Server 2014。

学生数据库:

  • notlar (@vize, @ders_id, @ogrenci_id)
  • ogrenciler (@id, @isim)
  • dersler (@ders_adi,@ders_id)

带有光标的学生签证备注形式的表格和列,课程名称中列出了课程。

输出如下:

Select 
    o1.adi , n1.vize, d1.ders_adi 
from 
    ogrenci o1, notlar n1, dersler d1 
where 
    o1.Ogr_ID = n1.Ogr_ID 
    and convert(varchar(22), n1.Ders_Kod) = convert(varchar(22), d1.Ders_Kod)  
order by 
    adi

DECLARE @adi NVARCHAR(MAX), @vize NVARCHAR(MAX), @ders NVARCHAR(MAX) 

DECLARE CRS_bolumler CURSOR FOR
    SELECT 
        o1.adi , n1.vize, d1.ders_adi 
    FROM
        ogrenci o1, notlar n1, dersler d1 
    WHERE
        o1.Ogr_ID = n1.Ogr_ID 
        AND CONVERT(VARCHAR(22), n1.Ders_Kod) = CONVERT(VARCHAR(22), d1.Ders_Kod) 
    ORDER BY
        adi

OPEN CRS_bolumler

FETCH NEXT FROM CRS_bolumler INTO @adi, @vize, @ders 

WHILE @@FETCH_STATUS =0
BEGIN   
    PRINT @adi + ',' + @vize + ',' + @ders

    FETCH NEXT FROM CRS_bolumler INTO @adi, @vize,@ders
END

CLOSE CRS_bolumler 
DEALLOCATE CRS_bolumler

留言:

 {Ali,60,Bilg. Müh. Giriş    
    Ali,50,Alg ve Prog-I       
    Ali,40,Matematik-I         
    Betül,30,Bilg. Müh. Giriş    
    Betül,30,Alg ve Prog-I       
    Betül,20,Matematik-I         
    Bilal,70,Bilg. Müh. Giriş    
    Bilal,80,Alg ve Prog-I       
    Bilal,90,Matematik-I         
    Feyza,80,Bilg. Müh. Giriş    
    Feyza,60,Alg ve Prog-I       
    Feyza,40,Matematik-I         
    Leyla,20,Bilg. Müh. Giriş    
    Leyla,30,Alg ve Prog-I       
    Leyla,20,Matematik-I }      

我要打印出来。 我的请求是获取同名学生的签证名和课程名如下:

{Ali,60,Bilg. Müh. Giriş ,50,Alg ve Prog-I   ,40,Matematik-I         
Betül,30,Bilg. Müh. Giriş ,30,Alg ve Prog-I ,20,Matematik-I         
Bilal,70,Bilg. Müh. Giriş ,80,Alg ve Prog-I  ,90,Matematik-I         
Feyza,80,Bilg. Müh. Giriş  ,60,Alg ve Prog-I ,40,Matematik-I         
Leyla,20,Bilg. Müh. Giriş,30,Alg ve Prog-I ,20,Matematik-I }  

问题的解决方法:

select o.isim, 
       stuff((
            select ', ' + ltrim(str(n.vize)) + ', ' + d.ders_adi
            from notlar n
            inner join dersler d on n.ders_id = d.ders_id
            where n.ogrenci_id = o.id
            FOR XML PATH('')
            ), 1, 2, '') as vizeler
from ogrenciler o;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM