У меня есть 3 таблицы базы данных с именами пациентов, тестов и групп
В таблице пациентов есть столбцы с именем пациента и 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 с функциями Lookupset
Успешно, но повторение строки с номерами тестов - если у пациента 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
Я хочу, чтобы результат был в одной строке для каждого пациента.
Извините за длинный вопрос, но я хотел прояснить мою ситуацию.
это запрос к базе данных





ИСПОЛЬЗУЙТЕ [мастер] ИДТИ
/ ****** Объект: База данных [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 = 1024 КБ, MAXSIZE = 2048 ГБ, FILEGROWTH = 10% ) ИДТИ
ALTER DATABASE [NewTest] SET COMPATIBILITY_LEVEL = 100 ИДТИ
ЕСЛИ (1 = FULLTEXTSERVICEPROPERTY ('IsFullTextInstalled')) начинать EXEC [NewTest]. [Dbo]. [Sp_fulltext_database] @action = 'enable' конец ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ ANSI_NULL_DEFAULT ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ ANSI_NULLS ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ ANSI_PADDING ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ ANSI_WARNINGS ИДТИ
ИЗМЕНИТЬ БАЗУ ДАННЫХ [NewTest] ВЫКЛЮЧИТЬ ARITHABORT ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ AUTO_CLOSE ИДТИ
ALTER DATABASE [NewTest] ВКЛЮЧИТЬ AUTO_CREATE_STATISTICS ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ AUTO_SHRINK ИДТИ
ALTER DATABASE [NewTest] ВКЛЮЧИТЬ AUTO_UPDATE_STATISTICS ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ CURSOR_CLOSE_ON_COMMIT ИДТИ
ALTER DATABASE [NewTest] SET CURSOR_DEFAULT GLOBAL ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ CONCAT_NULL_YIELDS_NULL ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ NUMERIC_ROUNDABORT ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ QUOTED_IDENTIFIER ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ RECURSIVE_TRIGGERS ИДТИ
ALTER DATABASE [NewTest] SET DISABLE_BROKER ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ AUTO_UPDATE_STATISTICS_ASYNC ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ DATE_CORRELATION_OPTIMIZATION ИДТИ
ИЗМЕНИТЬ БАЗУ ДАННЫХ [NewTest] ВЫКЛЮЧИТЬ ДОВЕРИТЕЛЬНО ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ ALLOW_SNAPSHOT_ISOLATION ИДТИ
ИЗМЕНИТЬ БАЗУ ДАННЫХ [NewTest] УСТАНОВИТЬ ПРОСТОЙ ПАРАМЕТРИЗАЦИЮ ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ READ_COMMITTED_SNAPSHOT ИДТИ
ALTER DATABASE [NewTest] ВЫКЛЮЧИТЬ HONOR_BROKER_PRIORITY ИДТИ
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] ВЫКЛЮЧИТЬ DB_CHAINING ИДТИ
Это запрос ВЫБЕРИТЕ dbo.patient.patientId, dbo.patient.PName, dbo.test.testName, dbo.groups.groupName, dbo.groups.groupId ОТ dbo.patient ВНУТРЕННЕЕ СОЕДИНЕНИЕ dbo.patientDetails ON dbo.patient.patientId = dbo.patientDetails.patientID ВНУТРЕННЕЕ СОЕДИНЕНИЕ dbo.test ON dbo.patientDetails.testId = dbo.test.testId ВНУТРЕННЕЕ СОЕДИНЕНИЕ dbo.groups ON dbo.test.groupId = dbo.groups.groupId
это результат моего запроса Имя пациента ID Тест Gruop_name 1 пациент 1 Тест 1 Группа 1 1 пациент 1 Тест 2 Группа 1 1 пациент1 Тест3 Группа1 2 пациент2 Тест4 Группа2 2 пациент2 Тест5 Группа2 Я хочу, чтобы результат был таким Имя_ пациента Имя_группы тестирования 1 пациент1 Тест1, Тест2, Тест2 Группа1 2 пациент2 Тест3, Тест4 Группа1
Доброго времени суток Самех Аввад,
Это нить немного беспорядка. Я постараюсь объяснить, что я понимаю, и ответить на вопрос, который я понимаю.
Во-первых, я рекомендую удалить лишние «ответы», в которых вы пытались предоставить дополнительную информацию. Я понимаю, что интерфейс 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
Вы можете получить больше информации из этого сообщения в моем блоге, которые также включают решение для более старых версий SQL Server
Пожалуйста, отправьте запросы, чтобы создать таблицу (ы) и вставить некоторые образцы данных + запрошенный результат в соответствии с образцами данных