【问题标题】:merge duplicate (row group) in rdlc report在 rdlc 报告中合并重复项(行组)
【发布时间】:2019-01-12 02:54:42
【问题描述】:

我有 3 个名为患者、测试和组的数据库表

患者表有患者姓名和 test_Id 列

测试表有test_idtest_namegroup_id

groups 表有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

这是我的示例,我尝试使用 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

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

很抱歉,这个问题太长了,但我想澄清一下我的情况。

【问题讨论】:

  • 请发布查询以创建表并根据示例数据插入一些示例数据+请求的结果
  • 这是数据库查询

标签: sql-server report rdlc


【解决方案1】:

使用 [主] 去吧

/****** 对象:数据库 [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_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10% ) 去吧

ALTER DATABASE [NewTest] 设置 COMPATIBILITY_LEVEL = 100 去吧

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 开始 执行 [NewTest].[dbo].[sp_fulltext_database] @action = 'enable' 结尾 去吧

ALTER DATABASE [NewTest] 设置 ANSI_NULL_DEFAULT OFF 去吧

ALTER DATABASE [NewTest] 设置 ANSI_NULLS OFF 去吧

ALTER DATABASE [NewTest] 设置 ANSI_PADDING OFF 去吧

ALTER DATABASE [NewTest] 设置 ANSI_WARNINGS OFF 去吧

ALTER DATABASE [NewTest] 设置 ARITHABORT 关闭 去吧

ALTER DATABASE [NewTest] SET AUTO_CLOSE OFF 去吧

ALTER DATABASE [NewTest] SET AUTO_CREATE_STATISTICS ON 去吧

ALTER DATABASE [NewTest] SET AUTO_SHRINK 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] 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] SET 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] 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
去吧

ALTER DATABASE [NewTest] SET DB_CHAINING OFF 去吧

【讨论】:

    【解决方案2】:

    这是查询 选择 dbo.patient.patientId、dbo.patient.PName、dbo.test.testName、dbo.groups.groupName、dbo.groups.groupId FROM dbo.patient 内部连接 dbo.patientDetails ON dbo.patient.patientId = dbo.patientDetails.patientID 内连接 dbo.test ON dbo.patientDetails.testId = dbo.test.testId INNER JOIN dbo.groups ON dbo.test.groupId = dbo.groups.groupId

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

    【讨论】:

      【解决方案3】:

      早安,Sameh Awwad,

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

      首先,我建议删除您试图提供更多信息的额外“答案”。我意识到 stackoverflow 接口很差,你不能添加包含格式化代码的 cmets。我们只能选择添加答案或简单的单行评论。但这些显然不是答案。

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

      据我了解,您的查询会为您带来以下结果:

      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 的解决方案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多