информация из таблицы Junction объединена в одно поле, относящееся к 1 записи с запросом

У меня возникли трудности с написанием запроса для этого примера базы данных: 3 таблицы = программный код, рабочий, рабочий код. Таблица программного кода имеет отношение «многие ко многим» с рабочей таблицей через таблицу рабочего кода. Раскладка стола следующая:

Work: ID,Employee ID, Type of work, description, hours
Work code: ID, Program Code, Work ID
Program Code: Program Code

Теперь сотрудник выполнит работу, но ему придется взимать плату за несколько кодов за эту работу. Это создает много записей в таблице кодов работ. Я хочу создать запрос, который выведет идентификатор сотрудника, тип работы, описание, часы и свяжет все программные коды, используемые для этой записи 1 задания. У меня есть запрос, который выполняется, но он создает строку для каждого программного кода вместо 1 строки со всеми программными кодами в одном поле. Это внешний интерфейс Access с серверной частью SQL.

Это то, что у меня есть прямо сейчас:

SELECT Work.ID, Work.[Employee ID], Work.[Type of work], Work.description, Work.hours, [Work Code].[Program Code]
FROM [Work Code] INNER JOIN [Work] ON [Work Code].[Work ID] = Work.ID;

Но я бы хотел, чтобы коды программ были в одном поле для каждого рабочего идентификатора.


person user2380034    schedule 29.08.2013    source источник


Ответы (1)


Единственное решение, которое я могу придумать, вероятно, не то, что вы ищете, - использование оператора GROUP BY.

SELECT Work.ID, Work.[Employee ID], Work.[Type of work], Work.description, 
Sum(Work.hours) as SumOfHours, [Work Code].[Program Code]
FROM [Work Code] INNER JOIN [Work] ON [Work Code].[Work ID] = Work.ID
GROUP BY Work.ID, Work.[Employee ID], 
Work.[Type of work], Work.description, [Work Code].[Program Code];

Я не знаю, есть ли в SQL какой-либо способ принудительно объединить несколько соединенных строк в одно поле в одной строке. Когда мне нужна такая функциональность, я обычно прибегаю к действительно грязному способу хранения, в данном случае, программных кодов в формате с разделителями-запятыми внутри рабочей таблицы. Я использую код, чтобы получить их там, обычно во время ввода программных кодов.

В качестве примечания я рекомендую вам отказаться от использования пробелов в именах таблиц и именах полей. SQL намного проще читать и писать без скобок во всем. Использование псевдонимов таблиц — еще один удобный способ сделать SQL более читабельным.

С некоторыми изменениями ваш SQL мог бы выглядеть так:

SELECT w.ID, w.EmployeeID, w.WorkType, w.Description, 
Sum(w.hours) as SumOfHours, wc.ProgramCode
FROM WorkCode AS wc INNER JOIN Work AS w ON wc.WorkID = w.ID
GROUP BY w.ID, w.EmployeeID, 
w.WorkType, w.Description, wc.ProgramCode;
person HK1    schedule 30.08.2013
comment
Спасибо за ответ, и в будущих базах данных я сделаю это. Когда я помещаю код в серверную часть SQL, я получаю сообщение об ошибке MSG208, уровень 16, состояние 1, строка 1 Недопустимое имя объекта «Рабочий код». Любые идеи о том, почему это произошло. Я просмотрел имена, и все они кажутся правильными? Еще раз спасибо за ваш ответ, он очень ценится и примечание. Когда я помещаю «Использовать имя базы данных», а затем помещаю в него запрос, он дает мне эту ошибку msg 8117, уровень 16, состояние 1, строка 4. Тип данных операнда nvarchar недействителен для оператора Sum. - person user2380034; 30.08.2013