我有3个名为patient、test和groups 的数据库表
患者表具有患者名称和test_Id列
测试表具有test_id
、test_name
和group_id
分组表有group_Id
和group_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 的解决方案