Merge sql results into one line

Asked

Viewed 4,024 times

3

I have the following database:

CREATE DATABASE  IF NOT EXISTS `materiais`; 
USE `materiais`;
 --
-- Table structure for table `categoria`
--

 CREATE TABLE `categoria` (
  `id_categoria` int(11) NOT NULL,
  `descricao_categoria` varchar(100) NOT NULL,
  `sin_ativo` char(1) NOT NULL DEFAULT 'S',
  PRIMARY KEY (`id_categoria`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `categoria`
--

 INSERT INTO `categoria` VALUES (1,'travessas','S'),(2,'Capa Cromada','S'),(3,'Coifas Vedante','S'),(4,'Chassis Metálicos','S'),(5,'Quadros Hidráulicos','S'),(6,'Tampa de Inspeção','S'),(7,'Abraçadeira Sextavada Tipo M','S'),(8,'Ponto de Filtro','S'),(9,'TE Ducha higiênica','S'),(10,'Carenagens Plásticas','S');

--
-- Table structure for table `metricas`
--

 CREATE TABLE `metricas` (
  `id_metricas` int(11) NOT NULL,
  `descricao` varchar(45) NOT NULL,
  PRIMARY KEY (`id_metricas`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `metricas`
--

 INSERT INTO `metricas` VALUES (1,'A Máx (mm)'),(2,'A Min (mm)'),(3,'B'),(4,'C'),(5,'B (mm)');

--
-- Table structure for table `imagem`
--

 CREATE TABLE `imagem` (
  `id_imagem` int(11) NOT NULL,
  `caminho` varchar(100) NOT NULL,
  `sin_ativo` varchar(45) DEFAULT 'S',
  `produto_id_produto` int(11) NOT NULL,
  PRIMARY KEY (`id_imagem`),
  KEY `fk_imagem_produto1` (`produto_id_produto`),
  CONSTRAINT `fk_imagem_produto1` FOREIGN KEY (`produto_id_produto`) REFERENCES `produto` (`id_produto`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `imagem`
--

 --
-- Table structure for table `especificacao`
--

DROP TABLE IF EXISTS `especificacao`;
 CREATE TABLE `especificacao` (
  `id_codigo` varchar(15) NOT NULL,
  `id_metricas` int(11) NOT NULL,
  `valor` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_codigo`,`id_metricas`),
  KEY `fk_codigo_has_metricas_metricas1` (`id_metricas`),
  KEY `fk_codigo_has_metricas_codigo1` (`id_codigo`),
  CONSTRAINT `fk_codigo_has_metricas_codigo1` FOREIGN KEY (`id_codigo`) REFERENCES `codigo` (`id_codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_codigo_has_metricas_metricas1` FOREIGN KEY (`id_metricas`) REFERENCES `metricas` (`id_metricas`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `especificacao`
--

 INSERT INTO `especificacao` VALUES ('CAN16',3,'57'),('CAN16',4,'63'),('CC00000016',1,'457'),('CC00000016',2,'317'),('CC00000016',5,'53'),('ESP400',1,'394'),('ESP400',2,'254');

--
-- Table structure for table `codigo`
--

 CREATE TABLE `codigo` (
  `id_codigo` varchar(15) NOT NULL,
  `id_produto` int(11) NOT NULL,
  `sin_ativo` char(1) NOT NULL DEFAULT 'S',
  `descricao` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_codigo`),
  KEY `fk_codigo_produto1` (`id_produto`),
  CONSTRAINT `fk_codigo_produto1` FOREIGN KEY (`id_produto`) REFERENCES `produto` (`id_produto`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 --
-- Dumping data for table `codigo`
--

 INSERT INTO `codigo` VALUES ('CAN16',7,'S',NULL),('CC00000016',8,'S',NULL),('ESP400',7,'S',NULL),('TMMC390100',2,'S',NULL),('TMRP1239070',1,'S',NULL),('TMRP3439070',1,'S',NULL);

--
-- Table structure for table `produto`
--

 CREATE TABLE `produto` (
  `id_produto` int(11) NOT NULL,
  `descricao` varchar(75) NOT NULL,
  `sin_ativo` char(1) NOT NULL DEFAULT 'S',
  `id_categoria` int(11) NOT NULL,
  PRIMARY KEY (`id_produto`),
  KEY `fk_produtos_categoria` (`id_categoria`),
  CONSTRAINT `fk_produtos_categoria` FOREIGN KEY (`id_categoria`) REFERENCES `categoria` (`id_categoria`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `produto`
--

 INSERT INTO `produto` VALUES (1,'Travessa para Registro de Pressão','S',1),(2,'Travessa para Monocomando','S',1),(3,'Travessa Tubular Para Cotovelo','S',1),(4,'Travessa para Distribuidor','S',1),(5,'Travessa para Aquecedor e tanque','S',1),(6,'Travessa para registro de gaveta','S',1),(7,'Conjunto Capa Cromada','S',2),(8,'CONJUNTO CAPA CROMADA CANOPLA EM LATÃO CROMADO','S',2),(9,'CONJUNTO CAPA CROMADA CANOPLA EM ABS','S',2),(10,'COIFA SIMPLES','S',3),(11,'COIFA SILICONE','S',3),(12,'COIFA TRIPLA','S',3),(13,'COIFA DUPLA','S',3),(14,'COIFA QUADRUPLA','S',3),(15,'CARENAGEM TANQUE','S',10),(16,'CHASSI TANQUE','S',4),(17,'QUADRO CHUVEIRO DE SOBREPOR - 2 TRAVESSAS','S',5),(18,'TAMPA DE INSPEÇÃO VENTILADA','S',6),(19,'ABRAÇADEIRA SEXTAVADA TIPO M','S',7),(20,'PONTO DE FILTRO','S',8),(21,'TE DUCHA HIGIÊNICA','S',9);

When performing the sql:

select p.id_produto, p.descricao, c.id_codigo, m.descricao,e.valor
from produto as p inner join codigo as c ON p.id_produto =
c.id_produto inner join especificacao as e ON e.id_codigo =
c.id_codigo inner join metricas as m ON e.id_metricas  = m.id_metricas
where c.id_produto = 7

The result for each product is given in two lines with in the example:

id_produto  descricao             id_codigo     descricao   valor
7          Conjunto Capa Cromada    CAN16           B       57
7          Conjunto Capa Cromada    CAN16           C       63
7          Conjunto Capa Cromada    ESP400      A Máx (mm)  394
7          Conjunto Capa Cromada    ESP400      A Min (mm)  254

I need the returned value to appear separated by product in just one line, for example:

id_produto descricao id_codigo descricao valor descricao valor

7      Conjunto Capa Cromada CAN16       B    57    C              63

How to solve?

  • What are the criteria for passing the result with 4 lines to 1 line only? You can group the results with GROUP BY for example or better specify your WHERE. Clarify what you want to see at the end as a result. (Your code in Sqlfiddle)

  • I would like the result of id_code to be in only one line. Something like 7 Set Cover Chrome CAN16 B 57 C 63

  • I looked but note that the bottom line value the C 63 did not appear.

  • I suggest you find another solution to the problem, because for every possible option of 'Description' you would have 2 more columns in your query. It doesn’t work like that. Suddenly, you ask another question by reporting the problem you want to solve and someone answers the best way.

  • One problem is that the number of columns may vary, maybe the use of a CASE with MAX solves but I don’t believe in solution via sql , maybe the use of a report generator that cross-references (Crystal Reports for example) is the best.

1 answer

1


So I think to solve your problem you can use an aggregation function like GROUP_CONCAT mysql.

select 
    p.id_produto
  , p.descricao
  , c.id_codigo
  , group_concat(m.descricao order by p.id_produto, ', ') as descricao
  , group_concat(e.valor  order by p.id_produto, ', ') as valor
from produto as p 
inner join codigo as c ON p.id_produto = c.id_produto 
inner join especificacao as e ON e.id_codigo = c.id_codigo 
inner join metricas as m ON e.id_metricas  = m.id_metricas
where c.id_produto = 7
group by p.id_produto
  , p.descricao
  , c.id_codigo
;

BS: I’m not sure if the syntax is correct, I found this information here, using as a base the listagg of Oracle 11g.

  • That’s right, thank you.

  • Oops. I’m glad I could help!

Browser other questions tagged

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