2013-03-13 2 views
1

Я в немного странной ситуации. Это стороннее приложение, которое из внешнего интерфейса не позволяет вызывать пользовательские процедуры или функции udf/scalar.Как преобразовать данные столбцов в список, разделенный запятой

Только вариант состоит в том, чтобы написать SQL, а ниже - как мои данные выглядят. Первый рис имеет ошибку в прошлом PID было предположить, чтобы быть 1 и второй последний 2.

enter image description here

Что мне нужно, чтобы это было это,

enter image description here

Это может легко сделать с помощью UDF/курсора в этом Advantage Database Server 9, но у меня нет выбора. Я не знаю, действительно ли это возможно. В Sybase существует функция, называемая списком, которая делает эту работу очень легко, но не уверен в этом.

Приложение позволяет использовать встроенные функции.

+0

У этого есть что-то вроде GROUP_CONCAT? – cha

+0

Не знаю, что знаю, но я ищу в документации – MStp

+0

Если нет, прочитайте эту дискуссию. Это может помочь вам реализовать эквивалент. http://www.sqlservercentral.com/Forums/Topic984025-391-1.aspx – cha

ответ

0

Я в конечном итоге создать следующую функцию путем подключения к словарю данных, но я получил ошибку.

CREATE FUNCTION GetReport_Meds 
    ( 
    PID varchar(15) 
    ) 
    RETURNS String 
BEGIN 
DECLARE Meds String; 
DECLARE CurMeds cursor AS SELECT med_code from medication where patient = 
TRIM(PID) and end_date is null; 
Meds = ""; 
OPEN CurMeds; 
WHILE FETCH CurMeds DO 
Meds = TRIM(Meds)+TRIM(CurMeds.med_code)+","; 
END WHILE; 
CLOSE CurMeds; 
RETURN LEFT(Meds,LEN(Meds)-1); 
END; 
 
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 5054; 
    [iAnywhere Solutions][Advantage SQL][ASA] Error 5054: The command cannot 
be completed with the current user permissions. Cannot 
create function object in the data dictionary. 

Я просил компанию, которая создала эту дб/приложение, чтобы добавить эту функцию в БД, так что я могу использовать его, позволяет увидеть, где я землю.

1
declare @table table 
(
    PID integer, 
    Medicine varchar(10) ) 

insert into @table values (1, 'ABC') 
insert into @table values (2, 'ABC') 
insert into @table values (1, 'DEF') 
insert into @table values (2, 'DEF') 
insert into @table values (1, 'GHI') 



SELECT DISTINCT a.PID, 
       Medicine = STUFF((SELECT ',' + b.Medicine 
            FROM @table b 
            WHERE a.PID = b.PID 
             FOR XML Path('')),1,1,'') 
FROM @table a 

РЕЗУЛЬТАТ:

**PID Medicine** 
1 ABC,DEF,GHI 
2 ABC,DEF 
+0

STUFF не является функцией поддержки в Advantage. –

+0

+1 для попытки, да, я не мог видеть, поддерживается ли файл – MStp

+0

Все STUFF делает удаление первого символа ',' в возвращаемой строке из запроса XML Path. Вы можете удалить его несколькими способами, но STUFF проще всего, так как не нужно знать длину строки. – cusman

Смежные вопросы