在rdlc报告中合并重复项(行组)

时间:2018-08-04 12:48:57

标签: sql-server report rdlc

我有3个数据库表,分别命名为Patient,Test和Groups

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

测试表具有test_idtest_namegroup_id

groups表具有group_Idgroup_Name

我进行了SQL查询,该查询将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

这是我的示例,我尝试使用Lookupset函数进行Join

成功,但重复测试编号的行-如果患者进行了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

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

很抱歉,我提出的问题很长,但是我想弄清楚我的情况。

3 个答案:

答案 0 :(得分:0)

USE [master] 开始

/ ******对象:数据库[NewTest]脚本日期:08/04/2018 15:36:09 ****** / 在主数据库上创建数据库[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_log.ldf',SIZE = 1024KB,MAXSIZE = 2048GB,FILEGROWTH = 10% ) 开始

ALTER DATABASE [NewTest] SET COMPATIBILITY_LEVEL = 100 开始

IF(1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 开始 EXEC [NewTest]。[dbo]。[sp_fulltext_database] @action ='启用' 结束 开始

ALTER DATABASE [NewTest] SET ANSI_NULL_DEFAULT OFF 开始

ALTER DATABASE [NewTest] SET ANSI_NULLS OFF 开始

ALTER DATABASE [NewTest]设置ANSI_PADDING OFF 开始

ALTER DATABASE [NewTest]设置ANSI_WARNINGS OFF 开始

ALTER DATABASE [NewTest]设置ARITHABORT OFF 开始

ALTER DATABASE [NewTest]设置为AUTO_CLOSE OFF 开始

ALTER DATABASE [NewTest]设置为AUTO_CREATE_STATISTICS ON 开始

ALTER DATABASE [NewTest]设置为AUTO_SHRINK OFF 开始

ALTER DATABASE [NewTest]设置为AUTO_UPDATE_STATISTICS ON 开始

ALTER DATABASE [NewTest] SET CURSOR_CLOSE_ON_COMMIT OFF 开始

ALTER DATABASE [NewTest]设置CURSOR_DEFAULT GLOBAL 开始

ALTER DATABASE [NewTest] SET CONCAT_NULL_YIELDS_NULL OFF 开始

ALTER DATABASE [NewTest] SET NUMERIC_ROUNDABORT OFF 开始

ALTER DATABASE [NewTest] SET QUOTED_IDENTIFIER OFF 开始

ALTER DATABASE [NewTest]设置RECURSIVE_TRIGGERS OFF 开始

ALTER DATABASE [NewTest] SET DISABLE_BROKER 开始

ALTER DATABASE [NewTest]设置为AUTO_UPDATE_STATISTICS_ASYNC OFF 开始

ALTER DATABASE [NewTest] SET DATE_CORRELATION_OPTIMIZATION OFF 开始

ALTER DATABASE [NewTest]设置可信任度关闭 开始

ALTER DATABASE [NewTest]设置ALLOW_SNAPSHOT_ISOLATION OFF 开始

ALTER DATABASE [NewTest]设置参数简单 开始

ALTER DATABASE [NewTest]设置为READ_COMMITTED_SNAPSHOT OFF 开始

ALTER DATABASE [NewTest]设置HONOR_BROKER_PRIORITY为OFF 开始

ALTER DATABASE [NewTest] SET READ_WRITE 开始

ALTER DATABASE [NewTest]设置恢复已满 开始

ALTER DATABASE [NewTest] SET MULTI_USER 开始

ALTER DATABASE [NewTest]设置PAGE_VERIFY CHECKSUM
开始

ALTER DATABASE [NewTest] SET DB_CHAINING OFF 开始

答案 1 :(得分:0)

这是查询 选择dbo.patient。PatientId,dbo.patient.PName,dbo.test.testName,dbo.groups.groupName,dbo.groups.groupId 来自dbo。Patient内部联接                       dbo。PatientDetails ON上的dbo.patientDetails = dbo。PatientDetails。PatientID内联接                       dbo.test ON dbo.patientDetails.testId = dbo.test.testId内联接                       dbo.groups ON dbo.test.groupId = dbo.groups.groupId

这是我查询的结果 Patient_ID名称测试组名称 1位病人1测试1组1 1名患者1 Test2 Group1 1位病人1 Test3组1 2名患者2 Test4 Group2 2名患者2 Test5 Group2  我希望结果像那样 Patient_ID名称测试组名称 1位患者1 Test1,Test2,Test2组1 2位患者2 Test3,Test4组1

答案 2 :(得分:0)

美好的一天,Sameh Awwad,

这是线程有点混乱。我将尝试解释我的理解并回答我所理解的问题。

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

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

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

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

You can get more information from this post in my blog,其中还包括针对旧版SQL Server的解决方案