SQL Query - put result on a row only

2
SELECT pga.Titulo, e.Codigo
     FROM Qualidade_Diagrama_Processo_Grupo_Acao pga 
     JOIN Qualidade_Diagrama_Acao_Entidade ae on (ae.Id_Proc_Grupo_Acao = pga.Id)
     JOIN Qualidade_Diagrama_Entidade e on (e.Id = ae.Id_Entidade)
WHERE ae.Id_Proc_Grupo_Acao = 48

IwouldliketheResulttobeonasingleline

Eg:

    
asked by anonymous 04.07.2018 / 14:38

2 answers

0

I did so:

SELECT DISTINCT pga.Titulo,
               UPPER ( SUBSTRING ( ISNULL ( STUFF (
                                                     ( SELECT convert(varchar(10), c.Codigo) + ',' codigo
                                                      FROM Qualidade_Diagrama_Processo_Grupo_Acao a
                                                      JOIN Qualidade_Diagrama_Acao_Entidade b ON (b.Id_Proc_Grupo_Acao = a.Id)
                                                      JOIN Qualidade_Diagrama_Entidade c ON (c.Id = b.Id_Entidade)
                                                      WHERE b.Id_Proc_Grupo_Acao = ae.Id_Proc_Grupo_Acao
                                                        FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 0, '' ),
                                            ' ' ),1,
                                                  254 ) )
FROM Qualidade_Diagrama_Processo_Grupo_Acao pga
JOIN Qualidade_Diagrama_Acao_Entidade ae ON (ae.Id_Proc_Grupo_Acao = pga.Id)
WHERE ae.Id_Proc_Grupo_Acao = 48

Result

    
04.07.2018 / 16:22
3

You need to use aggregation function STRING_AGG :

SELECT 
    pga.Titulo, 
    STRING_AGG(e.Codigo,', ') as Codigos
FROM Qualidade_Diagrama_Processo_Grupo_Acao pga 
JOIN Qualidade_Diagrama_Acao_Entidade ae on (ae.Id_Proc_Grupo_Acao = pga.Id)
JOIN Qualidade_Diagrama_Entidade e on (e.Id = ae.Id_Entidade)
WHERE ae.Id_Proc_Grupo_Acao = 48
Group by pga.Titulo

Edit:

After the database information is SQL Server 2012, and it does not have the String_AGG function:

You can use a common table expressions (CTE) recursively:

Considering the following table:

create table tabela
(
  id integer,
  titulo varchar(10));

insert into tabela values (1, 'TESTE');
insert into tabela values (2, 'TESTE');
insert into tabela values (3, 'TESTE');
insert into tabela values (4, 'TESTE');
insert into tabela values (5, 'TESTE');
insert into tabela values (6, 'TESTE');
insert into tabela values (7, 'TESTE');

The query would be:

WITH CTE (Id, ids, titulos, LENGTH) AS
  (SELECT 0,
          CAST('' AS VARCHAR(8000)),
          CAST(t.titulo AS VARCHAR(8000)),
          0
   FROM tabela t
   GROUP BY t.titulo
   UNION ALL SELECT p.Id,
                    CAST(ids + CASE
                                   WHEN LENGTH = 0 THEN ''
                                   ELSE ', '
                               END + CAST(p.id AS VARCHAR(8000)) AS VARCHAR(8000)),
                    CAST(titulo AS VARCHAR(8000)),
                    LENGTH + 1
   FROM CTE c
   INNER JOIN tabela p ON c.titulos = p.titulo
   WHERE p.id > c.id )
SELECT ids,
       titulos
FROM
  (SELECT Id,
          ids,
          RANK() OVER (PARTITION BY titulos
                       ORDER BY LENGTH DESC), titulos
   FROM CTE) D (Id, ids, rank, titulos)
WHERE rank = 1 ;
  

Result:

ids titulos
1, 2, 3, 4, 5, 6, 7 TESTE

I put it in SQLFiddle

Source

    
04.07.2018 / 15:01