合并rdlc报表中的重复项(行组)



我有3个名为patient、test和groups 的数据库表

患者表具有患者名称和test_Id列

测试表具有test_idtest_namegroup_id

分组表有group_Idgroup_Name

我进行了SQL查询,将3个表中的所有数据考虑到3个表之间的关系。

这是我查询的结果

patient_name     test_name              group_id
A                  test1                1
A                  test2                1
A                  test3                1
B                  test4                2
B                  test5                2

我希望结果像这个

Patient_name    Test_name                  group_id
A               test1, test2, test3          1
B               test4, test5                 2

这是我的例子,我试图使Join与Look心烦函数

它成功了,但重复了带有测试编号的行-如果患者有3次测试,则将重复3次行

,就像

A                       test1, test2, test3          1
A                       test1, test2, test3          1
A                       test1, test2, test3          1
B                       test4, test5                 2
B                       test4, test5                 2

我只希望每个患者的结果都在一行中。

很抱歉提了这么长的问题,但我想把我的情况说清楚。

USE[master]转到

/******对象:数据库[NewTest]脚本日期:08/04/2018 15:36:09******/在PRIMARY上创建数据库[NewTest](NAME=N'NewTest',FILENAME=N:C:\Program Files(x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewTest.mdf',SIZE=3072KB,MAXSIZE=UNLIMITED,FILEGROWTH=1024KB)登录(NAME=N'NewTest_log',FILENAME=N:C:\Program Files(x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewTest_lg.ldf',SIZE=1024KB,MAXSIZE=2048GB,FILEGROWTH=10%)转到

ALTER DATABASE[NewTest]SET COMPATIBILITY_LEVEL=100转到

IF(1=FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))开始EXEC[新测试]。[dbo]。[sp_fulltext_database]@action='enable'终止转到

ALTER DATABASE[NewTest]SET ANSI_NULL_DEFAULT OFF转到

ALTER DATABASE[NewTest]SET ANSI_NULLS OFF转到

ALTER DATABASE[NewTest]SET ANSI_PADDING OFF转到

ALTER DATABASE[NewTest]设置ANSI_WARNINGS OFF转到

ALTER DATABASE[NewTest]设置ARITHABORT关闭转到

ALTER DATABASE[NewTest]SET AUTO_CLOSE OFF转到

ALTER DATABASE[NewTest]设置AUTO_CREATE_STATISTICS ON转到

ALTER DATABASE[NewTest]设置AUTO_SRINK OFF转到

ALTER DATABASE[NewTest]设置AUTO_UPDATE_STATISTICS ON转到

ALTER DATABASE[NewTest]SET CURSOR_CLOSE_ON_COMMIT OFF转到

ALTER DATABASE[NewTest]SET CURSOR_DEFAULT GLOBAL转到

ALTER DATABASE[NewTest]设置CONCAT_NULL_YIELDS_NULL为OFF转到

ALTER DATABASE[NewTest]SET NUMERIC_ROUNDABORT OFF转到

ALTER DATABASE[NewTest]SET QUOTED_IDENTIFIER OFF转到

ALTER DATABASE[NewTest]SET RECURSIVE_TRIGGERS OFF转到

ALTER DATABASE[NewTest]SET DISABLE_BROKER转到

ALTER DATABASE[NewTest]SET AUTO_UPDATE_STATISTICS_ASYNC OFF转到

ALTER DATABASE[NewTest]SET DATE_CORRELATION_OPTIMIZATION OFF转到

ALTER DATABASE[NewTest]设置TRUSTWORTHY OFF转到

ALTER DATABASE[NewTest]设置ALLOW_SNAPSHOT_ISOLATION为OFF转到

ALTER DATABASE[NewTest]SET PARAMETERIZATION SIMPLE转到

ALTER DATABASE[NewTest]SET READ_COMMITTED_SNAPSHOT OFF转到

ALTER DATABASE[NewTest]SET HONOR_BROKER_PRIORITY OFF转到

ALTER DATABASE[NewTest]SET READ_WRITE转到

ALTER DATABASE[NewTest]SET RECOVERY FULL转到

ALTER DATABASE[NewTest]SET MULTI_USER转到

ALTER DATABASE[NewTest]SET PAGE_VERIFY CHECKSUM
GO

ALTER DATABASE[NewTest]设置DB_CHAINING关闭转到

这是查询选择dbo.patient.patientId、dbo.patient.PName、dbo.test.testName、dbo.groups.groupName、dbo.groups.groupId来自dbo.patient INNER JOINdbo.patientDetails ON dbo.patient.patientId=dbo.patentDetails.patientId INNER JOINdbo.test ON dbo.patientDetails.testId=dbo.test.testId INNER JOINdbo.groups ON dbo.test.groupId=dbo.groups.groupId

这是我查询的结果患者ID名称测试组名称1名患者1测试1组11名患者1测试2组11名患者1测试3组12名患者2测试4组22名患者2测试5组2我希望结果是这样的患者ID名称测试组名称1名患者1测试1、测试2、测试2组12名患者2测试3,测试4组1

你好Sameh Awad,

这个线程有点乱。我会尽力解释我所理解的内容,并回答我所了解的问题。

首先,我建议删除您试图提供更多信息的额外"答案"。我意识到stackerflow接口非常糟糕,您无法添加包含格式化代码的注释。我们只能选择添加答案或简单的单行注释。但这些显然不是答案。

此外,没有理由发布这些查询。我们不需要查询来创建数据库,我也没有要求这样做。我们需要查询来创建与问题相关的原始表,需要查询来插入示例数据,还需要查询来获得中期结果。

据我所知,您有一个查询,它会给您带来以下结果:

patient_name     test_name              group_id
A                  test1                1
A                  test2                1
A                  test3                1
B                  test4                2
B                  test5                2

你想得到这个中期结果,并得到以下最终结果:

Patient_name    Test_name                  group_id
A               test1, test2, test3          1
B               test4, test5                 2

我们可以从这里继续,但这不是最好的方法。也许我们可以提供更好的解决方案,将我们从原始数据直接带到最终结果。

无论如何,对于您当前的请求,如果您使用的是SQL Server 2017及更高版本,那么您可以使用函数STRING_AGG,它为您提供了非常简单的解决方案

/*************************************************** DDL+DML */
-- these queries will create the interim result
drop table if exists T;
create table T(patient_name nvarchar(10),test_name nvarchar(10),group_id int)
GO
insert T (patient_name,test_name,group_id)
values 
('A','test1',1),
('A','test2',1),
('A','test3',1),
('B','test4',2),
('B','test5',2)
GO
SELECT patient_name,test_name,group_id
FROM T
GO
/************************************************ solution */
SELECT patient_name,group_id,
STRING_AGG(test_name, ',') WITHIN GROUP (order by patient_name,group_id,test_name)
from T
group by patient_name,group_id
GO

您可以在我的博客中从这篇文章中获得更多信息,其中还包括旧版本SQL Server 的解决方案

最新更新