SQL Server查询以下列格式显示数据 -

时间:2015-02-17 06:26:47

标签: sql-server

patientno   cardName  cardtype
------------------------------
101         abc123     1001
102         wre234     1002
102         ioi123     1002
102         uio345     1003
103         opt123     1004
103         jhy126     1005

预期产出:

patientno              cardname 
-------------------------------
101                   1001:abc123
102                   1002:wre234,1002:ioi123,1003:uio345
103                   1004:opt123,1005:jhy126

3 个答案:

答案 0 :(得分:1)

Group_concat中的{p> MySQLSQL Server中不可用,直至当前版本。

你有一些手动选择:

1)构建一个标量函数,将患者姓名/ id作为参数,并显示连接的卡片名称/类型值,并将此功能应用于每个员工
  2)使用xml函数

    SELECT patientno, cardName = STUFF((SELECT 
                  cardName + ':' +  cardtype
                  FROM @x AS x2 WHERE patientno= x.patientno
                  ORDER BY row_num
                  FOR XML PATH('')), 1, 1, '')
    FROM @x AS x
    GROUP BY patientno
    ORDER BY patientno;

注意 未经测试的查询可能会有一些语法错误。

您可以阅读有关Stuff

的更多信息

答案 1 :(得分:1)

您可以创建一个stored procedure,其中包含一个逐个检索patientno的循环,cardNamecardType的相关数据可以通过{coalesceCreate table #tmp(patientno int, cardName varchar(max)); declare @patientno int; set @patientno= 0; declare @cardName varchar(max); Select @patientno=Min(patientno) From patientTable Where patientno > @patientno WHILE (@patientno is not null AND @patientno > 0) BEGIN Select @cardName = coalesce(',', @cardName) + cardtype + ':' + cardName from patientTable where patientno = @patientno Insert into #tmp(patientno, cardName)Values(@patientno, @cardName); --Fetch Next Select @patientno=Min(patientno) From patientTable Where patientno > @patientno END Select * From #tmp; 连接起来1}}功能。

{{1}}

这只是逻辑。您可以根据您的要求对其进行修改以使其正常工作。

答案 2 :(得分:1)

您需要构建一个代码来连接我的网站上的SQL字符串(see this article)。本教程介绍如何使用FOR XML PATH在SQL Server上连接字符串。请尝试以下SELECT语句

/*
create table PatientData (patientno int, cardName varchar(25), cardtype int)
go;
insert into PatientData select 101,'abc123',1001
insert into PatientData select 102,'wre234',1002
insert into PatientData select 102,'ioi123',1002
insert into PatientData select 102,'uio345',1003
insert into PatientData select 103,'opt123',1004
insert into PatientData select 103,'jhy126',1005
*/

with patients as (
    select distinct patientno from PatientData
)
select
    p.patientno,
    STUFF(
        (
          SELECT ',' + cast(d.cardtype as varchar(10))+ ':' + d.cardName
          FROM PatientData d
          WHERE d.patientno = p.patientno
          FOR XML PATH(''),TYPE
          ).value('.','VARCHAR(MAX)'
        ), 1, 1, '') as cardname
from patients p

输出如下所示

101 1001:abc123
102 1002:wre234,1002:ioi123,1003:uio345
103 1004:opt123,1005:jhy126