Query SQL - put result in a row only

Asked

Viewed 1,521 times

1

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

inserir a descrição da imagem aqui

I would like the result to be in one line

Ex:
inserir a descrição da imagem aqui

  • 2

    Do you have any questions about pivot table here you can help, this is one: https://answall.com/questions/307567/placements-of-a-line-in-columns

2 answers

3

You need to use the STRING_AGG aggregation function:

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 CTE (common table Expressions) 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 ;

Upshot:

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

I put in the Sqlfiddle

Source

  • blew this error :Msg 195, Level 15, State 10, Line 27 'STRING_AGG' is not a recognized built-in Function name.

  • version SQLSERVER 2012 @Diegorafaelsouza

  • Reply Updated @Daniellearrudatorres

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

Upshot

inserir a descrição da imagem aqui

Browser other questions tagged

You are not signed in. Login or sign up in order to post.