我有3个数据库表,分别命名为Patient,Test和Groups
患者表具有患者姓名和test_Id列
测试表具有test_id
,test_name
和group_id
groups表具有group_Id
和group_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
我只希望每个患者的结果在一行中。
很抱歉,我提出的问题很长,但是我想弄清楚我的情况。
答案 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的解决方案